HBase的读取数据的流程
读取数据的流程:
1) 客户端发起读取数据的请求, 首先会先连接zookeeper
2) 从zookeeper中获取一张 hbase:meta 表目前被哪个RegionSerer所管理
说明: hbase:meta 是HBase专门用于存储元数据的表, 此表只会有一个Region,也就是说这个Region只能被一个RegionServer所管理
3) 连接Meta表对应的RegionServer, 从这个表中获取, 要读取的表有哪些Region, 以及这些Region对应被哪些RegionServer所管理,从而确认要操作的RegionServer
注意:
如果执行Scan, 返回这个表所有Region对应的RegionServer的地址
如果执行get, 返回查询rowkey对应Region所在RegionServer的地址
4- 连接对应的RegionServer, 从RegionServer中对应Region中读取数据即可
读取顺序: 先内存 ---> blockCache(块缓存) ----> storeFile ---> 大HFile
注意: 读取块缓存只有在get操作才有效, 如果scan扫描 基本无意义
HBase的写入数据的流程
写入数据流程:
1- 由客户端发起写入数据的请求, 首先先连接zookeeper
2- 从zookeeper中获取hbase:meta表被那个RegionServer所管理
3- 连接对应RegionServer, 从Meta表获取要写入数据的表有哪些Region, 以及每个Region被那个RegionServer所管理, 然后根据Region的起始Rowkey 和 结束rowkey, 获取要写入数据的Region对应RegionServer的地址
大白话: 查询写入到那个Region, 这个Region被那个RegionServer所管理
4- 连接对应RegionServer, 开始进行数据写入操作, 写入时, 先将数据写入到这个RegionServer的HLog, 然后将数据写入到对应的Store模块下的MemStore中(可能写入多个MemStore), 当这两个位置都写入成功的时候, 客户端认为数据写入完成了
---------------以上 为客户端写入流程------------------------
异步操作: 上面客户端可能执行了多次后, 后续才会干活
5) 随着客户端不断的写入操作, MemStore中数据会越来越多, 当MemStore的数据达到一定的阈值(128M/1h)后, 就会启动flush刷新线程, 将内存中数据"最终"刷新到HDFS上, 形成一个StoreFile文件
6) 随着不断的进行Flush的刷新, 在HDFS上StoreFile文件会越来越多, 当StoreFlie文件达到一定的阈值(3个及以上)后,就会启动compact合并压缩机制, 将多个StoreFlie"最终"合并为一个大的HFile
7) 随着不断的合并, HFile文件会越来越大, 当这个大的HFile文件达到一定的阈值("最终"10GB)后,就会触发Split机制, 将大的HFile进行一分为二的操作, 形成两个新的大HFile文件, 此时Region也会进行一分为二,形成两个新的Region, 一个Region管理一个新的大Hfile, 旧的大HFile和对应Region就会被下线