读流程:
1.Client访问zookeeper,获取Hbase:meta所在HregionServer的节点信息
2.Client访问Hbase:meta所在的HregionServer,获取Hbase:meta记录的元数据后先加载到内存中,然后再从内存中查询出RowKey所在的Hregion
3.Client对RowKey所在的Hregion对应的HregionServer发起读取数据的请求
4.HregionServer构建RegionScanner ,用于对该Hregion的数据检索
5.RegionScanner构建storeScanner(Hregion中有多少个Store就需要构建多少个storeScanner,store的数量取决于table的ColumnFamily的数量),用于对该列族的数据检索
6.所有的storeScanner合并构建最小堆(已排序的完全二叉树)StoreHeap:PriorityQueue
7.storeScanner构建一个MemStoreScanner和一个或多个StoreFileScanner
8.过滤掉能够确定所要查询的 RowKey 一定不在的 StoreFileScanner 或 MemStoreScanner(布隆过滤器);
9.经过筛选后留下的 Scanner 开始做读取数据的准备,将对应的 StoreFile 定位到满足的 RowKey 的起始位置;
10.将所有的 StoreFileScanner 和 MemStoreScanner 合并构建最小堆 KeyValueHeap:PriorityQueue,排序的规则按照 KeyValue 从小到大排序;
11.从 KeyValueHeap:PriorityQueue 中经过一系列筛选后一行行的得到需要查询的 KeyValue。
默认情况下:先从 BlockCache 查找数据,如果没有,再从 MemStore 上查找,如果 MemStore 中也没有,再到 StoreFile 上进行查找。其 中 StoreFile 的扫瞄先会使用 Bloom Filter 过滤那些不可能符合条件的 HFile,然后使用 Data Block Index 快速定位 Cell,并将其加载到 BlockCache 中,然后从 BlockCache 中读取,目的是为了加快后续的查询,然后在返回结果给客户端。
写流程:
1.Client 访问 ZooKeeper,获取 hbase:meta 所在 HRegionServer 的节点信息;
2.Client 访问 hbase:meta 所在的 HRegionServer,获取 hbase:meta 记录的元数据后先加载到内存中,然后再从内存中查询出 RowKey 所在 的 HRegion (HRegion 所在的 HRegionServer); 3.Client 对 RowKey 所在的 HRegion 对应的 HRegionServer 发起写入数据请求;
4.建立连接后,首先将 DML 要做的操作写入到日志 HLog;
5.然后将数据的修改更新到 MemStore 中,本次操作结束。一个 HRegion 由多个 Store 组成,一个 Store 对应一个列族,Store 包括位于内存 中的 Memstore 和位于磁盘的 StoreFile,写操作先写入 MemStore;
当 MemStore 数据达到阈值后(默认 128M),创建一个新的 MemStore; 旧的 MemStore 将刷写为一个独立的 StoreFile(HRegionServer 会启动 FlushCache 进程写入 StoreFile)并存放到 HDFS,最后删除 HLog 中 的历史数据。