HBase的核心原理

HBase的读取数据的流程

读取数据的流程: 
	1) 客户端发起读取数据的请求, 首先要先连接zookeeper集群
	
	2) 从zookeeper中获取一张 hbase:meta 表, 目前被哪个RegionServer所管理
		说明: hbase:meta 是HBase专门用于存储元数据的表, 此表只会有一个Region, 也就说这个表只会被一个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的startRow和endRow, 判断需要将数据写入到那个Region上, 并确定这个Region被哪个RegionServer所管理, 将RegionServer的地址返回
		大白话: 查询写入到哪个Region, 这个Region被哪个RegionServer所管理
		
	4) 连接对应RegionServer,开始进行数据写入操作, 写入时需要将数据写入到对应的Store模块下的MemStore中(可能写入多个MemStore),同时也会将本次写入操作记录在对应RegionServer的HLog中, 当这个两个位置都写入完成后, 客户端才认为数据写入完成了
	
-----------------------------以上为客户端写入流程------------------------------------------

异步操作: 当上述客户端可能执行了N多次后, 后续才会干活

5) 随着客户端不断的写入操作, MemStore中数据会越来越多, 当MemStore的数据达到一定的阈值(128M/1H)后,就会启动Flush 刷新线程, 将内存中数据 "最终" 刷新到HDFS上,形成一个StoreFile文件

6) 随着不断地Flush的刷新, 在HDFS上StoreFile文件会越来越多, 当StoreFile文件达到一定的阈值(3个及以上)后, 就会启动compact合并压缩机制, 将多个StoreFile "最终" 合并为一个大的HFile

7) 随着不断的合并, HFile文件会越来越大,当这个大的HFile文件达到一定的阈值( "最终" 10GB)后,就会触发Split的分裂机制, 将大的HFile进行一分为二操作, 形成两个新的大HFile文件, 此时Region也会进行一分为二操作, 形成两个新的Region, 一个Region管理一个新的大HFile, 旧的大HFile和对应Region就会下线删除