HBase 架构分析
阅读本文大概需要 3 分钟。
Hbase 简单一句话描述就是:基于 HDFS 存储的面向列、高可靠的分布式数据库。底层使用 HDFS 作为存储系统,使用 MapReduce 来作为计算框架,Zookeeper 为它已提供刻可靠性和failover(故障切换)机制,其中 Zookeeper 的作用还不止这些,下面会提到 zookeeper 在 HBase 的其他作用。
HBase 使用场景:1.海量数据存储。2.快速随机访问。3.大量写操作的应用场景。
本文将从 HBase 的架构开始,如下图所示,有些细节没有画出来。
下面分别介绍每个组件发挥的作用:
Client 通过 PRC 连接到集群。Client 与 Hmaster 交互进行管理类的操作,Client 与 HReginServer 交互进行读写操作。
Zookeepr 记录 -Root 表的位置,Hmaster 的地址,并且 HReginServer 会以Ephedral的方式注册到 zookeeper 上,这样 Hmaster 就可以随时感知 HReginServer 的健康状态了。
Hmaster 可以启动多个,通过 zookeeper 的Master Election机制保证总有一个Master在运行。它主要是是做一些管理操作,比如:1.管理用户对表的增删改查操作、2.管理 RegionSever 的负载均衡和调整 regins 分布。3.regins split 之后负责调整新的 region 分布、4.在 RegionServer 停机之后,负责失效机器上的 Region 迁移。
HRegionServer 是最核心的组件了,主要是负责客户端的读写 IO 请求,向 HDFS 读写数据。每个 HRegionServer 负责管理一些 HRegion 对象,每个 HRegion 对象对应 Table 表的 regin,每个HRegion 有多个 HStore 组成。而每个 HStore 对应 Table 中的一个 Column Family 的存储。其中Column Family 是一个几种的存储单元,故将相同 IO 特性的 Column 放到同一个Column Family 中会更加高效。
HStore 是由两部分组成:MemStore 和 StoreFile,在 hbase 中,数据在更新时会首先写入 WAL 日志和内存中,在内存中的数据是排序的,当 MemStore 累积到一定阈值的时候,就会创建一个新的 MemStore 并且将老的 MemStore 添加到 Flush 队列中,有单独的线程 flush 到磁盘中,成为一个 StoreFile 。
StoreFile 是可读的,一旦创建就没有办法修改了,所以之后进来的数据(不管是新增还是更新数据),都会经历内存到写到一个新的 StoreFile 的过程,但是随着 StoreFile 的数量一致积累到一定阈值,此时会触发Compact 操作,即把所有的小文件(StoreFile)里面的数据根据 row key进行版本合并和删除,生成一个大的 StoreFile, 单个StoreFile 的大小超过一定的阈值,会触发 Split 操作,把当前的 Region 等分成两个 Region。新的两个 Region 会被分配到 Hsmater 分配到对应的 HRegionServer 上。
小结:从上面这段话也可以得出一个结论,就是 HBase 写入数据时是不断增加的一个过程,对数据的修改和删除是在 Compact 阶段进行的。这个过程用户感知不到,所以用户只管往内存里面写数据就是了,提高了写数据的吞吐量。
Hlog ,每个 HRegionServer 都有一个 Hlog 对象,Hlog 是实现了 Write Ahead Log 的类,每次用户写数据进来的时候,会先写到 Hlog 文件中,同时也会写到 MemStore 中。当 HRegionServer 宕机之后,HMatser 会通过 zookeeper 感知到,接下来 HMaster 是这样做的:
它会将遗留的 Hlog 文件根据不同的Region拆分,然后放到对应的 Region 目录下面,接下来再将这些 Region 重新分配到新的 HRegionServer 上。;领取这些新的 Region 的HRegionServer 会进行 Load Region 过程,期间它会发现有历史 HLog 需要处理,因此会 Reload Hlog 到 MemStore 中,然后 flush 到 StoreFile 中,完成数据恢复。
【大数据开发学习资料领取方式】:加入大数据技术学习交流群458345782,点击加入群聊,私信管理员即可免费领取