Hbase的数据合并

Hbase数据合并

在这里插入图片描述

合并分类

  • HBase 根据合并规模将 Compaction 分为了两类:MinorCompaction 和 MajorCompaction
  • Minor Compaction
    • 是指选取一些小的、相邻的StoreFile将他们合并成一个更大的StoreFile,在这个过程中不会
      处理已经Deleted或Expired的Cell
    • 但是会处理超过TTL的数据
    • 一次Minor Compaction的结果是让小的storefile变的更少并且产生更大的StoreFile。
  • Major Compaction
    • 是指将所有的StoreFile合并成一个StoreFile
    • 清理三类无意义数据:被删除的数据、TTL过期数据、版本号超过设定版本号的数据。
    • 一般情况下,Major Compaction时间会持续比较长,整个过程会消耗大量系统资源,对上层
      业务有比较大的影响。因此线上业务都会将关闭自动触发Major Compaction功能,改为手动
      在业务低峰期触发。

合并时机

  • 触发compaction的方式有三种:Memstore刷盘、后台线程周期性检查、手动触发。

  • Memstore刷盘

    • memstore flush会产生HFile文件,文件越来越多就需要compact。
    • 每次执行完Flush操作之后,都会对当前Store中的文件数进行判断,一旦文件数大于配置,就
      会触发compaction。
    • compaction都是以Store为单位进行的,而在Flush触发条件下,整个Region的所有Store都
      会执行compact
    • 在这里插入图片描述
  • 后台线程周期性检查

    • 后台线程定期触发检查是否需要执行compaction,检查周期可配置。
      • hbase.server.thread.wakefrequency(默认10000毫秒)
        *hbase.server.compactchecker.interval.multiplier(默认1000)
      • CompactionChecker大概是2hrs 46mins 40sec 执行一次
    • 线程先检查文件数是否大于配置,一旦大于就会触发compaction。
    • 如果不满足,它会接着检查是否满足major compaction条件,
      • 如果当前store中hfile的最早更新时间早于某个值mcTime,
      • 就会触发major compaction(默认7天触发一次,可配置手动触发)。
  • 手动触发

    • 一般来讲,手动触发compaction通常是为了执行major compaction,一般有这些情况需要手
      动触发合并
      • 是因为很多业务担心自动major compaction影响读写性能,因此会选择低峰期手动触
        发;
      • 也有可能是用户在执行完alter操作之后希望立刻生效,执行手动触发major
        compaction;
      • 是HBase管理员发现硬盘容量不够的情况下手动触发major compaction删除大量过期数
        据;

合并策略

承载了大量IO请求但是文件很小的HFile,compaction本身不会消耗太多IO,而且合并完成之后对读的
性能会有显著提升。

  • 线程池选择

    • HBase CompacSplitThread类内部对于Split、Compaction等操作专门维护了各自所使用的
      线程池
    • 和Compaction相关的是如下的longCompactions和shortCompactions
    • 前者用来处理大规模compaction,后者处理小规模compaction
      • 默认值为2 * maxFlilesToCompact * hbase.hregion.memstore.flush.size
      • 如果flush size 大小是128M,该参数默认值就是2 * 10 * 128M = 2.5G
  • 合并策略选择

    • HBase 主要有两种 minor 策略: RatioBasedCompactionPolicy (0.96.x之前)和
      ExploringCompactionPolicy(当前默认)

    • RatioBasedCompactionPolicy(基于比列的合并策略)

      从老到新逐一扫描HFile文件,满足以下条件之一停止扫描
      当前文件大小<比当前文件新的所有文件大小总和*ratio(高峰期1.2,非高峰期5)
      当前所剩候选文件数<=阈值(默认为3)

    • ExploringCompactionPolicy策略(默认策略)

      基于Ratio策略,不同之处在于Ratio策略找到一个合适文件集合就停止扫描,而Exploring策略
      会记录所有合适的文件集合,然后寻找最优解,待合并文件数最多或者待合并文件数相同的情况下
      文件较小的进行合并

    在这里插入图片描述

    • FIFO Compaction策略

      收集过期文件并删除,对应业务的列簇必须设置有TTL

    • Tier-Based Compaction策略(分层策略)

      针对数据热点情况设计的策略,根据候选文件的新老程度将其划分为不同的等级,每个等级都有对
      应的Ratio,表示该等级文件比选择为参与Compation的概率

    • Stripe Compation策略(条纹策略)

      将整个Store中的文件按照key划分为多个range,此处称为stripe,一个Stripe内部就类似于
      一个小Region,可以执行Minon Compation和major Compation

  • 执行文件合并

    • 分别读出待合并hfile文件的KV,并顺序写到位于./tmp目录下的临时文件中
    • 将临时文件移动到对应region的数据目录
    • 将compaction的输入文件路径和输出文件路径封装为KV写入WAL日志,并打上compaction
      标记,最后强制执行sync
  • 将临时文件移动到对应region的数据目录

  • 将compaction的输入文件路径和输出文件路径封装为KV写入WAL日志,并打上compaction
    标记,最后强制执行sync

  • 将对应region数据目录下的compaction输入文件全部删除

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HBase中的数据存储在Region中,每个Region负责一段连续的key范围。当一个Region的数据量过大或者key范围过于分散时,需要进行Region的拆分或合并操作。 ## Region拆分 Region拆分可以将一个过大的Region分割成两个或多个相对较小的Region,以便更好地管理和利用硬件资源。 ### 触发条件 当一个Region的数据量超过了hbase.hregion.max.filesize(默认为1GB)或者key范围过于分散时,会触发Region拆分操作。 ### 操作过程 1. HBase会在Region拆分点(split point)处选择一个新的Region作为拆分后的Region之一,同时将原有Region的数据分配到拆分后的两个Region中。 2. HBase会将拆分点及其前面的数据都分配给新的Region,将拆分点后面的数据留在原有的Region中。 3. HBase会将拆分点及其前面的数据范围作为新Region的key范围,将原有Region的key范围修改为拆分点后面的数据范围。 ### 操作示例 假设有一个Region的key范围为[a,c),数据量为1.5GB,超过了hbase.hregion.max.filesize,需要进行拆分操作。 1. HBase会选择一个拆分点(split point),例如选择b作为拆分点。 2. HBase会创建一个新的Region,key范围为[b,c),同时将[a,b)范围内的数据分配给新的Region,将[c,∞)范围内的数据留在原有的Region中。 3. HBase会将[a,b)范围作为原有Region的key范围,将[b,c)范围作为新Region的key范围。 ## Region合并 Region合并可以将相邻的两个Region合并为一个Region,以便更好地利用硬件资源。 ### 触发条件 当相邻的两个Region的数据总量小于hbase.hregion.max.filesize(默认为1GB)且key范围连续时,会触发Region合并操作。 ### 操作过程 1. HBase会选择相邻的两个Region进行合并,将它们的数据合并到一个新的Region中。 2. HBase会将两个Region的key范围合并为一个key范围。 ### 操作示例 假设有两个相邻的Region,key范围分别为[a,b)和[b,c),数据总量小于hbase.hregion.max.filesize,需要进行合并操作。 1. HBase会将两个Region的数据合并到一个新的Region中,key范围为[a,c)。 2. HBase会将两个Region的key范围合并为[a,c)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值