HBase数据的写入过程:
1、Client访问zookeeper,获取元数据存储所在的regionserver
2、通过刚刚获取的地址访问对应的regionserver,拿到对应的表存储的regionserver
3、去表所在的regionserver进行数据的添加
4、查找对应的region,在region中寻找列族,先向memstore中写入数据
5、当memstore写入的值变多,触发溢写操作(flush),进行文件的溢写,成为一个StoreFile
6、当溢写的文件过多时,会触发文件的合并(Compact)操作,合并有两种方式(major,minor)
多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除
minor compaction:小范围合并,默认是3-10个文件进行合并,不会删除其他版本的数据。
major compaction:将当前目录下的所有文件全部合并,一般手动触发,会删除其他版本的数据(不同时间戳的)
7、当region中的数据逐渐变大之后,达到某一个阈值,会进行裂变(一个region等分为两个region,并分配到不同的regionserver),原本的Region会下线,新Split出来的两个Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上。
HBase数据的读取过程:
(1)Client访问zookeeper,获取hbase:meta所在RegionServer的节点信息
(2)Client访问hbase:meta所在的RegionServer,获取hbase:meta记录的元数据后先加载到内存中,然后再从内存中根据需要查询的RowKey查询出RowKey所在的Region的相关信息(Region所在RegionServer)
(3)Client访问RowKey所在Region对应的RegionServer,发起数据读取请求
(4)RegionServer构建RegionScanner(需要查询的RowKey分布在多少个Region中就需要构建多少个RegionScanner),用于对该Region的数据检索
(5)RegionScanner构建StoreScanner(Region中有多少个Store就需要构建多少个StoreScanner,Store的数量取决于Table的ColumnFamily的数量),用于对该列族的数据检索
(6)多个StoreScanner合并构建最小堆(已排序的完全二叉树)StoreHeap:PriorityQueue
(7)StoreScanner构建一个MemStoreScanner和一个或多个StoreFileScanner(数量取决于StoreFile数量)
(8)过滤掉某些能够确定所要查询的RowKey一定不在StoreFile内的对应的StoreFileScanner或MemStoreScanner
(9)经过筛选后留下的Scanner开始做读取数据的准备,将对应的StoreFile定位到满足的RowKey的起始位置
(10)将所有的StoreFileScanner和MemStoreScanner合并构建最小堆KeyValueHeap:PriorityQueue,排序的规则按照KeyValue从小到大排序
(11)从KeyValueHeap:PriorityQueue中经过一系列筛选后一行行的得到需要查询的KeyValue。