hbase compact和split策略

---compact split笔记

 

compact策略:

在启动region之后,memflush之后,用户compact调用compact

使用策略类needsCompaction方法,hfile数量大于hbase.hstore.compaction.min 和 hbase.hstore.compactionThreshold的最大值数(默认值为3)

 

major compact触发:(hfile由mem flush生成)

HStore检查是否进行compact时候,现在now - 上次major时间大于hbase.hregion.majorcompaction下次时间间隔  =》 hfile个数大于1 || 只有一个hfile(最早的ts>ttl)整个文件过期 => 进行marjor compact

hbase shell和admin进行major_compact

compact file <= sum(hfile) * hbase.hstore.compaction.ratio 将small compact转为major compact

最小的tts到时间了,进行major compact

 

 

compact策略:(一次compact不会compact提供所有的hfile,会选择最好的一组)

ExploringCompactionPolicy

一、选择符合要求的一组hfile进行compact

1.hfile数>=minFiles

2.hfile数<=maxFiles

3.sum(hfile)大小<=hbase.hstore.compaction.max

4.一个hfile大小<sum(hfile)-hfile(不让一个hfile过大)

二、选择最优解(最优的一组hfile)

选择sum(hfile)大小最小的作为第一个组合,选择能合并更多的hfile,并且sum(hfile)大小更小的

 

 split触发:

1.flush之前会检测区域中HStoreFile数目是否超过hbase.hstore.blockingStoreFiles,如果超过且没有等待超时会调用CompactSplitThread.requestSplit(HRegion) 

2.flush之后会调用HRegion.checkSplit()检测是否需要split,如果需要则调用CompactSplitThread.requestSplit(HRegion)

3.compact之后会调用CompactSplitThread.requestSplit(HRegion)

4.hbaseadmin split table or region

 

split策略:

IncreasingToUpperBoundRegionSplitPolicy

(init)initialSize = hbase.increasing.policy.initial.size(预先设置初始值大小) 或hbase.hregion.memstore.flush.size (memflush大小)

获取this.region所在表的所有region数 getCountOfCommonTableRegions 为regioncount

当regioncount在0到100之间,取配置hbase.hregion.max.filesize(默认10G)或initialSize*(regioncount^3)的最小值  否则取配置hbase.hregion.max.filesize(默认10G)

如,只有一个region,128*1^3=128M

        之后:                 128*2^3=1024M

                                    128*3^3=3456M

                                    128*4^3=8192M

                                    128*5^3=16000M(15G) => 10G 当有5个region就可以用配了

 

结论:

compact

无法避免,

增大hbase.hstore.compaction.min 和 hbase.hstore.compactionThreshold可以减少compact频率,但是延迟compact时间,反之亦然

通过减少生成hfile数量减少compact,

通过设置较大的hbase.hregion.majorcompaction可以减少marjor compact频率

可以定时人为进行mar compact

split

可以避免,split可以只设置hbase.hregion.max.filesize很大就停止了region split操作

<think>嗯,用户问的是HBase BulkLoad引起大量小文件Compact的问题。首先,我需要回忆一下HBase的BulkLoad机制。BulkLoad通常用于将大量数据直接导入HBase,而无需经过RegionServer的写路径,这样可以避免写放大,提升导入效率。但问题出在BulkLoad生成的小文件可能导致后续的Compaction压力增大。 首先,得解释BulkLoad的基本流程。BulkLoad是通过生成HFile文件,然后直接加载到HBase的表中。这些HFile文件会被移动到对应Region的目录下。如果导入的数据量不大,或者Region的划分比较粗,可能会导致每个Region都生成很多小的HFile文件。这时候,HBase在后续的Compaction过程中需要合并这些小文件,消耗大量资源,甚至影响集群性能。 接下来,需要考虑为什么BulkLoad会产生小文件。可能的原因有几个:比如每次BulkLoad生成的文件大小没有达到HFile的配置大小,或者导入的数据分布不均匀,导致多个小文件被分配到不同的Region。另外,如果频繁执行BulkLoad,每次导入的数据量都不大,自然会产生很多小文件。 然后,要分析Compaction的作用。HBaseCompaction分为MinorMajor两种。Minor Compaction合并少量的HFile,减少读取时的IO次数;Major Compaction则合并所有HFile,并清理过期数据。当存在大量小文件时,RegionServer需要频繁进行Compaction,尤其是Major Compaction,这会占用大量磁盘IOCPU资源,可能导致请求延迟增加,甚至RegionServer宕机。 接下来,需要思考如何解决这个问题。可能的解决方案包括调整HFile的大小配置,确保每次BulkLoad生成的文件足够大;或者在BulkLoad之前对数据进行预处理,比如按照Region的划分进行排序,减少小文件的数量。另外,调整Compaction策略,比如使用Stripe Compaction或者Date-Tiered Compaction,可能更有效地处理小文件。还可以考虑在非高峰时段手动触发Major Compaction,或者增加Compaction的线程数,提高处理能力。 不过,用户可能需要更具体的步骤,比如配置参数的调整,或者实际操作中的最佳实践。比如,设置hbase.hstore.compaction.min.sizehbase.hstore.compaction.max.size来控制哪些文件会被合并,或者通过HBase的预分区策略,提前规划Region的分布,减少数据导入后的分裂移动。 还要注意,BulkLoad生成的文件是否进行了压缩,如果使用合适的压缩算法,可能减少文件数量大小。另外,HBase的版本HDFS的配置也可能影响这一过程,需要确认是否相关参数优化到位。 可能还需要考虑HBase的写入模式读取模式的平衡,BulkLoad虽然高效,但后续的维护成本也需要权衡。比如,是否可以在BulkLoad之后立即触发Compaction,或者是否有工具可以合并小文件,避免对线上服务造成影响。 最后,总结一下,需要从BulkLoad的数据准备、HBase的配置优化、Compaction策略调整等多个方面入手,才能有效减少小文件带来的Compaction压力。</think>HBase BulkLoad 引起大量小文件 Compact 的问题通常与数据导入方式存储机制有关。以下是逐步分析及解决方案: --- ### **1. BulkLoad 机制回顾** - **BulkLoad 原理** 通过 MapReduce/Spark 等工具直接生成 HFile 文件,绕过 RegionServer 的写路径(WAL、MemStore),直接将文件移动到 HBase 表目录。适合海量数据快速导入。 - **优点** 避免写放大、减少 RegionServer 压力。 - **潜在问题** 若每次 BulkLoad 生成大量小文件(例如每个文件远小于默认 HFile 大小 10GB),会导致后续 Compaction 压力剧增。 --- ### **2. 小文件 Compact 问题的成因** #### **(1) 文件粒度不合理** - 每次 BulkLoad 的数据量过小,生成多个小 HFile。 - 未合理预分区(Pre-split),导致数据分散到过多 Region。 #### **(2) HFile 合并逻辑** - HBase 自动触发 **Minor Compaction**(合并少量文件) **Major Compaction**(合并所有文件)。 - 大量小文件会频繁触发 Compaction,消耗 CPU/IO 资源,甚至阻塞读写。 #### **(3) 负载不均衡** - 小文件分布在多个 Region 中,导致全局 Compaction 风暴。 --- ### **3. 解决方案** #### **(1) 优化 BulkLoad 流程** - **增大单个 HFile 大小** 调整 MapReduce/Spark 作业的 `hbase.mapreduce.hfileoutputformat.blocksize`(默认 64KB),确保生成较大的 HFile。 ```xml <property> <name>hbase.hregion.max.filesize</name> <value>10737418240</value> <!-- 10GB --> </property> ``` - **预分区(Pre-split)** 根据 RowKey 分布提前创建 Region,避免数据写入后自动分裂产生小文件。 ```java byte[][] splits = new byte[][] { "1000".getBytes(), "2000".getBytes() }; admin.createTable(tableDesc, splits); ``` - **合并输入数据** 在 BulkLoad 前对数据进行排序,减少输出文件数量(例如通过 MapReduce 的 CombineFileInputFormat)。 --- #### **(2) 调整 Compaction 策略** - **选择 Compaction 算法** 根据场景选择 `StripeCompaction`(适合时间序列数据)或 `DateTieredCompaction`。 ```xml <property> <name>hbase.hstore.engine.class</name> <value>org.apache.hadoop.hbase.regionserver.StripeStoreEngine</value> </property> ``` - **限制 Compaction 频率** 调整触发阈值: ```xml <property> <name>hbase.hstore.compaction.min</name> <value>3</value> <!-- 至少3个文件触发 --> </property> <property> <name>hbase.hstore.compaction.max</name> <value>10</value> <!-- 单次最多合并10个文件 --> </property> ``` --- #### **(3) 手动干预** - **主动触发 Major Compaction** 在业务低峰期手动合并: ```bash hbase shell> major_compact 'table_name' ``` - **合并小文件工具** 使用 HBase 内置工具(如 `HFileMerge`)或自定义脚本合并小文件。 --- #### **(4) 监控与调优** - **监控指标** 关注 HBase UI 中的 **Compaction Queue Length**、**StoreFile Count**。 - **调整 RegionServer 资源** 增加 Compaction 线程数: ```xml <property> <name>hbase.regionserver.thread.compaction.large</name> <value>4</value> </property> ``` --- ### **4. 总结** 通过优化 BulkLoad 数据分布、调整 Compaction 策略、合理预分区以及资源控制,可有效减少小文件引发的 Compact 压力。核心目标是 **减少小文件数量** **降低 Compaction 频率**,平衡写入性能与存储稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值