hbase手动compact与split

本文介绍了一个用于HBase的Shell脚本,该脚本能够检查和自动拆分过大的Region,以提高HBase数据库的性能。通过设置阈值,脚本会遍历所有超过指定大小的Region并进行拆分,同时提供了检查功能确保拆分后的Region大小合理。

 

2016年08月28日 14:07:25 小小程序员1986 阅读数:1405

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/jethai/article/details/52345352

#!/bin/bash

die () {
    echo >&2 "$@"
    echo "usage:"
    echo "       $0 check|split table_name [split_size]"
    exit 1
}

[[ "$#" -lt 2 ]] && die "at least 2 arguments required, $# provided"

COMMAND=$1
TABLE=$2
SIZE="${3:-1073741824}"

split() {
    region_key=`python /home/hduser/hbase/hbase-scan.py -t hbase:meta -f "RowFilter (=, 'substring:$1')"`
    echo "split '$region_key'" | hbase shell
}

if [ "$COMMAND" != "check" ] ; then
    for region in `hadoop fs -ls /hbase/data/default/$TABLE | awk {'print $8'}`
    do
        [[ ${region##*/} =~ ^\. ]] && continue
        [[ `hadoop fs -du -s $region | awk {'print $1'}` -gt $SIZE ]] && split ${region##*/}
    done

    # check after split
    sleep 60
fi

for region in `hadoop fs -ls /hbase/data/default/$TABLE | awk {'print $8'}`
do
    [[ ${region##*/} =~ ^\. ]] && continue
    [[ `hadoop fs -du -s $region | awk {'print $1'}` -gt $SIZE ]] && echo "${region##*/} (`hadoop fs -du -s -h $region | awk {'print $1 $2'}`) is a huge region" || echo "${region##*/} (`hadoop fs -du -s -h $region | awk {'print $1 $2'}`) is a small region"
done

 

hbase-scan.py

 
  1. import subprocess

  2. import datetime

  3. import argparse

  4. import csv

  5. import gzip

  6. import happybase

  7. import logging

  8.  
  9. def connect_to_hbase():

  10.     return happybase.Connection('itr-hbasetest01')

  11.  
  12. def main():

  13.     logging.basicConfig(format='%(asctime)s %(name)s %(levelname)s: %(message)s',level=logging.INFO)

  14.  
  15.     argp = argparse.ArgumentParser(description='EventLog Reader')

  16.     argp.add_argument('-t','--table', dest='table', default='eventlog')

  17.     argp.add_argument('-p','--prefix', dest='prefix')

  18.     argp.add_argument('-f','--filter', dest='filter')

  19.     argp.add_argument('-l','--limit', dest='limit', default=10)

  20.  
  21.     args = argp.parse_args()

  22.  
  23.     hbase_conn = connect_to_hbase()

  24.  
  25.     table = hbase_conn.table(args.table)

  26.     logging.info("scan start")

  27.     scanner = table.scan(row_prefix=args.prefix, batch_size=1000, limit=int(args.limit), filter=args.filter)

  28.     logging.info("scan done")

  29.     i = 0

  30.     for key, data in scanner:

  31.         logging.info(key)

  32.         print key

  33.         i+=1

  34.  
  35.     logging.info('%s rows read in total', i)

  36.  
  37. if __name__ == '__main__':

  38.     main()

 

本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1717714

<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分为Minor和Major两种。Minor Compaction合并少量的HFile,减少读取时的IO次数;Major Compaction则合并所有HFile,并清理过期数据。当存在大量小文件时,RegionServer需要频繁进行Compaction,尤其是Major Compaction,这会占用大量磁盘IO和CPU资源,可能导致请求延迟增加,甚至RegionServer宕机。 接下来,需要思考如何解决这个问题。可能的解决方案包括调整HFile的大小配置,确保每次BulkLoad生成的文件足够大;或者在BulkLoad之前对数据进行预处理,比如按照Region的划分进行排序,减少小文件的数量。另外,调整Compaction策略,比如使用Stripe Compaction或者Date-Tiered Compaction,可能更有效地处理小文件。还可以考虑在非高峰时段手动触发Major Compaction,或者增加Compaction的线程数,提高处理能力。 不过,用户可能需要更具体的步骤,比如配置参数的调整,或者实际操作中的最佳实践。比如,设置hbase.hstore.compaction.min.size和hbase.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 频率**,平衡写入性能存储稳定性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值