【HBase十二】HFile存储的是一个列族的数据

本文探讨了HBase中HFile的存储特性,指出每个HFile专门存储一个表的一个列族数据。通过建立包含两个列族的表并进行数据插入、flush等操作,观察到MemStore和HFile的数量变化,验证了这一机制。同时,文章提到了HBase UI中的Num.Store和Num.Storefiles指标,解释了它们与列族和HFile的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在HBase中,每个HFile存储的是一个表中一个列族的数据,也就是说,当一个表中有多个列簇时,针对每个列簇插入数据,最后产生的数据是多个HFile,每个对应一个列族,通过如下操作验证

 

1. 建立一个有两个列族的表

 

create 'members','colfam1','colfam2'

 

2. 在members表中的colfam1中插入50*50*50条数据,然后flush到磁盘,通过UI观察MemStore和HFile个数的变化

 

for i in '0'..'50' do for j in '0'..'50' do for k in '0'..'50' do put 'members', "row-colfam1-#{i}#{j}#{k}", "colfam1:#{j}#{k}", "#{j}#{k}" end end end

 

做完如上操作, members表的HFile数目不变,但是MemStore占用23.3M空间

 

4. 将members表数据flush到磁盘

 

 

flush 'members'

 

 

做完如上操作, members表的HFile数目增1,但是MemStore占用10几K空间,即MemStore的内存空间被释放

 

5.

5.1 在members表中的colfam1和colfam2中分别插入1条数据

for i in '100'..'100' do for j in '100'..'100' do for k in '100'..'100' do put 'members', "row-colfam1-#{i}#{j}#{k}", "colfam1:#{j}#{k}", "#{j}#{k}" end end end

for i in '100'..'100' do for j in '100'..'100' do for k in '100'..'100' do put 'members', "row-colfam2-#{i}#{j}#{k}", "colfam2:#{j}#{k}", "#{j}#{k}" end end end

 

做完如上操作, members表的HFile数目不变,因为数据量小,MemStore的变化也基本没有

 

5.2 将members表数据flush到磁盘

 

flush 'members'

 

做完如上操作,即使数据量很小,members表的HFile数目也是增加了两个,可见HBase为每个列簇创建了一个HFile文件

 

 

 

 

 Num.Store vs Num.Storefiles

 

在HBase的UI,有两个统计指标,Num.Store和Num.Storefiles,其中Num.Store表示Store的数目,一个Column Family对应一个Store;Num.Storefile对应着这个表的所有HFile的数目,每个Storefile根据其对应的ColumnFamily不同,分属于不同的Store,但是HBase UI上看不出来,每个Store有几个Storefiles

 

 

 http://hadoop.master:16301/rs-status?filter=all#memoryStats

 http://hadoop.master:16301/rs-status?filter=all#regionStoreStats

 

 

 

 

 

### 关于 HBase 使用 HFile 导入数据时卡住的原因分析 在使用 `LoadIncrementalHFiles` 将 HFile 数据导入 HBase 表的过程中,可能会遇到性能瓶颈或进程卡住的情况。以下是可能导致该现象的主要原因及其对应的解决方案: #### 1. **批量加载的 HFile 数量过多** 如果单个 Region 中某个HFile 数量超过配置的最大值,则会导致 Bulk Load 失败或者过程变慢。可以通过调整参数 `-Dhbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily=1024` 来控制每个 Region 和中的最大 HFile 数量[^1]。 ##### 解决方案: 减少每次生成的 HFile 文件数量,确保其不超过设定的阈值。可以适当降低 MapReduce 输出阶段的并发度,从而减小最终生成的 HFile 总数。 --- #### 2. **WAL 日志堆积引发 MemStore 刷新** 当 RegionServer 上的日志文件(Write-Ahead Log, WAL)数量达到上限(默认为 32),会强制触发 MemStore 的刷新操作[^2]。这可能会影响正在进行的 Bulk Load 流程,尤其是在高负载情况下。 ##### 解决方案: - 增加日志文件的数量限制,修改参数 `hbase.regionserver.maxlogs` 至更高的数值。 - 如果确认不需要 WAL 记录,在执行 Bulk Load 前可临时禁用 WAL 功能,通过设置 `hbase.mapreduce.hfileoutputformat.force.writes=false` 实现。 --- #### 3. **磁盘 I/O 或网络带宽不足** Bulk Load 是一个高度依赖磁盘读写的流程,尤其是当目标表分布在多个 RegionServer 节点上时,跨节点传输大量 HFile 文件会对集群的整体吞吐能力造成压力。 ##### 解决方案: - 提前规划存储路径,尽量让 HDFS 数据靠近对应的目标 RegionServer,减少不必要的远程访问开销。 - 检查并优化底层硬件资源分配情况,例如增加 SSD 替代 HDD、提升网卡速率等措施。 --- #### 4. **时间戳过滤机制失效** 尽管提供了选项 `-Dhbase.mapreduce.hfileoutputformat.skip.timestamp.maxvalue=true` 用于忽略旧版本记录,但在某些场景下此功能未必生效。因此即使启用了这一特性,仍可能存在冗余数据被写入的现象。 ##### 解决方案: 验证输入源是否已按需清理重复项;必要时重新设计 ETL 工具链路以保证唯一性和时效性约束条件满足后再提交给下游处理模块。 --- ### 示例代码:优化后的命令调用方式 以下是一个经过改进的脚本模板,综合考虑了以上提到的各种因素: ```bash hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles \ -Dhbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily=512 \ -Dhbase.regionserver.maxlogs=64 \ -Dhbase.mapreduce.hfileoutputformat.force.writes=false \ -Dhbase.mapreduce.hfileoutputformat.skip.timestamp.maxvalue=true \ hdfs://xx.xx.xx.xx:xxxx/hbase/data/tmp/your_job_output_path your_table_name ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值