【HBase】Apache HBase内核深度剖析( 五 )


【HBase】Apache HBase内核深度剖析
本文插图

(RegionServer结构)
一个RegionServer由一个HLog , 一个BlockCache和多个Region组成 , HLog保障数据写入的可靠性 , BlockCache缓存查询的热点数据提升效率 , 每一个Region是HBase中的数据表的一个分片 , 一个RegionServer会承担多个Region的读写 , 而每一个Region又由多个store组成 。 store中存储着列簇的数据 。 例如一个表包含两个列簇的话 , 这个表的所有Region都会包含两个Store , 每个Store又包含Mem和Hfile两部分 , 写入的时候先写入Mem , 根据条件再落盘成Hfile 。
RegionServer管理的HLog的文件格式如下所示:

【HBase】Apache HBase内核深度剖析
本文插图

(RegionServer管理HLog架构 , 来自网络)
HLog的日志文件存放在HDFS中 , hbase集群默认会在hdfs上创建hbase文件夹 , 在该文件夹下有一个WAL目录 , 其中存放着所有相关的HLog , HLog并不会永久存在 , 在整个HBase总HLog会经历如下过程:

  • HLog构建:任何写入操作都会先记录到HLog , 因此在发生写入操作的时候会先构建HLog 。
  • HLog滚动:因为HLog会不断追加 , 所以整个文件会越来越大 , 因此需要支持滚动日志文件存储 , 所以HBase后台每间隔一段时间(默认一小时)会产生一个新的HLog文件 , 历史HLog标记为历史文件 。
  • HLog失效:一旦数据进入到磁盘 , 形成HFile后 , HLog中的数据就没有存在必要了 , 因为HFile存储在HDFS中 , HDFS文件系统保障了其可靠性 , 因此当该HLog中的数据都落地成磁盘后 , 该HLog会变为失效状态 , 对应的操作是将该文件从WAL移动到oldWAl目录 , 此时文件依旧存在 , 并未进行删除 。
  • HLog删除:hbase有一个后台进程 , 默认每间隔一分钟会对失效日志文件进行判断 , 如果没有任何引用操作 , 那么此时的文件会被彻底的从物理删除 。
对于RegionServer来讲 , 每一个RegionServer都是一个独立的读写请求服务 , 因此HBase可以水平增加多个RegionServer来达到水平扩展的效果 , 但是多个RegionServer之间并不存在信息共享 , 也就是如果一个海量任务计算失败的时候 , 客户端重试后 , 链接新的RegionServer后 , 整个计算会重新开始 。
HBase怎么用虽然HBase目前使用非常广泛 , 并且默认情况下 , 只要机器配置到位 , 不需要特别多的操作 , HBase就可以满足大部分情况下的海量数据处理 , 再配合第三方工具像phoenix , 可以直接利用HBase构建一套OLAP系统 , 但是我们还是要认识到HBase的客观影响 , 知道其对应的细节差异 , 大概来说如果我们使用HBase , 有以下点需要关心一下:
  1. 因为HBase在RegionServer对写入的检查机制 , 会导致客户端在符合条件的情况下出现重试的情况 , 所以对于较为频繁的写入操作 , 或者较大数据量的写入操作 , 推荐使用直接产生HFlie然后load到HBase中的方式 , 不建议直接使用HBase的自身的Put API 。
  2. 从使用来讲如果业务场景导致HBase中存储的列簇对应的数据量差异巨大 , 那么不建议创建过多的列簇 , 因为HBase的存储机制会导致不同列簇的数据存储在同一个HBase的HFile中 , 但是split机制在数据量增加较大的情况下 , 会发生拆分 , 则会导致小数据量的列簇被频繁的split , 反而降低了查询性能 。
  3. RegionServer是相互独立的 , 所以如果想要让集群更加的稳定高效 , 例如如果想实现RegionServer集群 , 达到信息共享 , 任务增量计算 , 需要自己修改RegionServer的代码 。
  4. 对于HBase来讲 , 很多场景下 , 像如果Region正在Split , 或者Mem正在Dump , 则无法进行对应的操作 , 此时错误信息会被以异常的形式返回到客户端 , 再由客户端进行重试 , 因此在使用过程中 , 需要结合我们的应用场景 , 考虑如何设置类似于buffer大小的参数 , 以尽可能少的降低因为内部操作引起的客户端重试 , 特别是在使用类似opentsdb的这类集成hhbase的数据的情况下 。


    推荐阅读