Hbase的数据切分

Hbase的数据切分,第1张

Hbase的数据切分 Hbase数据切分

通过切分,一个region变为两个近似相同大小的子region,再通过balance机制均衡到不同 region
server上,使系统资源使用更加均衡。

切分原因
  • 数据分布不均匀
    • 同一 region server 上数据文件越来越大,读请求也会越来越多。一旦所有的请求都落在同一
      个 region server 上,尤其是很多热点数据,必然会导致很严重的性能问题。
  • compaction性能损耗严重
    • compaction本质上是一个排序合并的 *** 作,合并 *** 作需要占用大量内存,因此文件越大,占
      用内存越多
    • compaction有可能需要迁移远程数据到本地进行处理(balance之后的compaction就会存在
      这样的场景),如果需要迁移的数据是大文件的话,带宽资源就会损耗严重
  • 资源耗费严重
    • Hbase的数据写入量也是很惊人的,每天都可能有上亿条的数据写入
    • 不做切分的话一个热点region的新增数据量就有可能几十G,用不了多长时间大量读请求就会
      把单台region server的资源耗光。
触发时机
  • 每次数据合并之后都会针对相应region生成一个requestSplit请求,requestSplit首先会执行
    checkSplit,检测file size是否达到阈值,如果超过阈值,就进行切分。
  • 检查阈值算法主要有两种:ConstantSizeRegionSplitPolicy( 0.94版本)和
    IncreasingToUpperBoundRegionSplitPolicy(当前)
  • ConstantSizeRegionSplitPolicy :
    • 系统会遍历region所有store的文件大小,如果有文件大小 > hbase.hregion.max.filesize(默
      认10G),就会触发切分 *** 作。
  • IncreasingToUpperBoundRegionSplitPolicy:
    • 如果store大小大于一个变化的阀值就允许split。
    • 默认只有1个region,那么逻辑这个region的store大小超过 1 * 1 * 1 * flushsize * 2 =
      128M * 2 =256M 时,才会允许split
    • 切分之后会有两个region,其中一个region中的某个store大小大于 2 * 2 * 2 * flushsize * 2
      = 2048M 时,则允许split
    • 后续超过hbase.hregion.max.filesize + hbase.hregion.max.filesize * 随机小数 *
      hbase.hregion.max.filesize.jitter才允许split
    • 基本也就固定了,如果粗劣的计算可以把这个hbase.hregion.max.filesize的大小作为最后的
      阀值,默认是10G
切分流程
  • 寻找切分点

    • 将一个region切分为两个近似大小的子region,首先要确定切分点。切分 *** 作是基于region执
      行的,每个region有多个store(对应多个column famliy)。系统首先会遍历所有store,找
      到其中最大的一个,再在这个store中找出最大的HFile,定位这个文件中心位置对应的
      rowkey,作为region的切分点。
  • 开启切分事务

    • 切分线程会初始化一个SplitTransaction对象,从字面上就可以看出来split流程是一个类似‘事
      务’的过程,整个过程分为三个阶段:prepare - execute - rollback

    • prepare阶段

      • 在内存中初始化两个子region,具体是生成两个HRegionInfo对象,包含tableName、
        regionName、startkey、endkey等。同时会生成一个transaction journal,这个对象
        用来记录切分的进展
    • execute 阶段

      • region server 更改ZK节点 /region-in-transition 中该region的状态为SPLITING。
      • master检测到region状态改变。
      • region在存储目录下新建临时文件夹.split保存split后的daughter region信息。
      • parent region关闭数据写入并触发flush *** 作,将写入region的数据全部持久化到磁盘。
      • 在.split文件夹下新建两个子文件夹,称之为daughter A、daughter B,并在文件夹中生
        成引用文件,分别指向父region中对应文件。
      • 将daughter A、daughter B拷贝到Hbase根目录下,形成两个新的region。
      • parent region通知修改 hbase.meta 表后下线,不再提供服务。
      • 开启daughter A、daughter B两个子region。
      • 通知修改 hbase.meta 表,正式对外提供服务。
    • rollback阶段

      • 如果execute阶段出现异常,则执行rollback *** 作。
      • 为了实现回滚,整个切分过程被分为很多子阶段,回滚程序会根据当前进展到哪个子阶
        段清理对应的垃圾数据。
切分优化
  • 对于预估数据量较大的表,需要在创建表的时候根据rowkey执行 region 的预分配。
  • 通过region预分配,数据会被均衡到多台机器上,这样可以一定程度解决热点应用数据量剧增导致
    创建表的时候根据rowkey执行 region 的预分配。
  • 通过region预分配,数据会被均衡到多台机器上,这样可以一定程度解决热点应用数据量剧增导致
    的性能问题。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5679021.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存