多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 1. 元数据存储 HBase 中有一个系统表 hbase:meta 存储 HBase 元数据信息,可以在 HBase Web UI 查看到相关信息。如下图。 ![](https://img.kancloud.cn/ad/8c/ad8c488ef0c5d4695d5cfae7828180a5_1066x490.png) 该表记录保存了每个表的 Region 地址,还有一些其他信息,例如 Region 的名字,对应表的名字、开始行键、结束行键、服务器的信息。hbase:meta 表中每一行对应一个单一的 Region。数据如下图。 ![](https://img.kancloud.cn/53/91/5391fc66426b31827ff342ddeadfe8f0_1062x283.png) ![](https://img.kancloud.cn/98/86/9886cc88ae626112fbf0b183b5015db9_1084x485.png) zooKeeper 中存储了 hbase:meta 表的位置,客户端可以通过 ZooKeeper 查找到 hbase:meta 表的位置,hbase:meta 是 hbase 当中一张表,肯定由一个HRegionServer 来 管 理 , 其 实 主 要 就 是 要 通 过 ZooKeeper 的`/hbase/meta-region-server`获取存储`hbase:meta`表的 HRegionServer 的地址。 ![](https://img.kancloud.cn/94/54/9454f1cb80f887e3d58967358f46bd25_1070x111.png) ![](https://img.kancloud.cn/d6/7e/d67e199410a3bbbf9ee9ac0bedc29662_1063x454.png) 图中可以看出,hbase:meta 表的位置是 hadoop103。 <br/> # 2. 读流程 HBase 读数据流程如图所示 ![](https://img.kancloud.cn/42/bc/42bccf1ab497a5974b0c61280a6e2d11_1304x669.png) 1、Client 先访问 ZooKeeper,从 meta 表读取 Region 的位置,然后读取 meta表中的数据。meta 中又存储了用户表的 Region 信息; 2、根据 RowKey 在 meta 表中找到对应的 Region 信息; 3、找到这个 Region 对应的 HRegionServer; 4、查找对应的 Region; 5、先从 MemStore 找数据,如果没有,再到 BlockCache 里面读; 6、BlockCache 还没有,再到 StoreFile 上读(为了读取的效率); 7、如果是从 StoreFile 里面读取的数据,不是直接返回给客户端,而是先写入BlockCache,再返回给客户端。 从整体的方面看,如下图所示 ![](https://img.kancloud.cn/21/60/2160b6c897095ad1678f39c06e3ace0b_1307x574.png) <br/> # 3. 写流程 Hbase 写流程如图所示(写数据比读数据要快): ![](https://img.kancloud.cn/db/5f/db5ffa4e8f9c186869a4a9567634aa85_1304x571.png) (1)Client 访问 ZooKeeper,获取 Meta 表所处位置(ip) (2)访问 Meta 表,然后读取 Meta 表中的数据。 (3)根据 namespace(类似与关系型数据库中的数据库)、表名和 RowKey 在 Meta 表中找到该 RowKey 应该写入到哪个 Region。 (4)找到这个 Region 对应的 RegionServer,并发送写数据请求 (5)HRegionServer 将数据先写到 HLog(Write Ahead Log)。为了数据的持久化和恢复; (6)HRegionServer 将数据写到内存(MemStore); (7)反馈 Client 写成功。 写数据这一块也可以看出,HBase 将数据写入到内存中后,就返回给客户端写入成功,响应非常快。这也是为什么 HBase 写数据速度快的原因。 <br/> # 4. 数据 Flush 过程 从上面写入数据的流程中可以看出,HBase 写数据是写入到 MemStore 内存就会返回客户端了,并没有直接落磁盘。这也是为什么 HBase 插入数据会比较快的原因,磁盘 IO 非常小。 <br/> 那么什么时候数据会落磁盘呢?其实 MemStore 空间是有限的,当 MemStore 数据达到阈值(默认是 128M,老版本是 64M),RegionServer 将数据刷到 HDFS 上,生成 HFile,然后将内存中的数据删除,同时删除 HLog 中的历史数据。该操作是由 RegionServer 自己完成的。