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就会下线删除