HBase的读流程
- 客户端从zk获取.META.表所在的regionserver;
- 去对应的regionserver读取.META.表,获取region所在信息(region在哪个regionserver上保存的信息);
- 客户端到了regionserver时,先找到region,先去在Block Cache(读缓存)中读取数据,如果读取到了数据就返回;
- 如果在Block Cache中没读取到数据,就去MemStore 和 Store File(HFile)中查询目标数据,并将Store File中的数据先写入Block Cache,将Block Cache和MemStore中查到的所有数据进行合并。此处所有数据是指同一条数据的不同版本(time stamp)或者不同的类型(Put/Delete);
- 将合并后的最终结果返回给客户端。
注意:HBase上 RegionServer 的内存分为两个部分,一部分作为 MemStore ,主要用来写;另外一部分作为 BlockCache ,主要用于读数据;
HBase的写流程
- 客户端从ZK获取到存放.META.表的regionserver;
- 客户端从对应的regionserver上获取META.表的信息。并从获取的信息中,找到写数据对应的regionserver,也就是put请求发送到哪台regionserver上;
- 客户端找到对应的regionserver,先将数据写入到HLog中,数据和相应的操作都写入HLog中;
- 再去region中,将数据写入到MemStore中,当MemStore中的数据到达阈值时,就将它的数据写入到缓冲队列,由缓冲队列写入到HFile中;
- HFile会将小文件进行合并,防止文件存放到HDFS上时,namenode上的元数据过于臃肿。它也会将过大的文件进行拆分。