0%

HBase配置优化

HBase 配置优化:读多写少、写多读少,参数调法不一样

HBase 的默认配置能跑,但不一定适合你的业务。

  • 写多读少(日志采集、实时写入)→ MemStore 要大、刷盘要少
  • 读多写少(用户画像、历史查询)→ BlockCache 要大、Scanner 缓存要调大
  • 混合负载 → 平衡 MemStore 和 BlockCache 的内存配比

HDFS 层配置——HBase 的”地基”

HBase 的数据最终存在 HDFS 上,HDFS 配置不对,HBase 再调也白搭。

参数 推荐值 为什么调 调大了有风险吗
dfs.support.append true HBase 的 WAL 需要追加写,不开这个 HBase 起不来 必须开,没得选
dfs.datanode.max.transfer.threads 4096 HBase 刷盘、合并、读取同时进行,默认 4096 够用但高并发时可调大 设太大占用内存
dfs.image.transfer.timeout 60000(60s) HBase 的 StoreFile 可能很大,传输慢会超时 设太大可能掩盖网络问题

写入性能优化——“写得多”怎么调

场景特征: 日志采集、实时数据写入、IoT 数据上报。写入 QPS 高,读少。

参数 默认值 推荐值(写入密集) 为什么调 风险
hbase.client.write.buffer 2MB 5-10MB 客户端攒一批再写,减少 RPC 次数 设太大客户端 OOM
hbase.regionserver.handler.count 10 30-50 处理写请求的线程数,高并发写需要更多线程 设太大 CPU 上下文切换开销
hbase.hregion.memstore.flush.size 128MB 256MB(写密集) 大 MemStore 减少刷盘频率,降低小文件产生 设太大单个 Region 内存压力大
hbase.regionserver.global.memstore.upperLimit 0.4 0.45 允许更多内存给 MemStore,减少刷盘触发 调太高挤占 BlockCache

写入密集场景配置示例(hbase-site.xml):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- 写缓冲调大 -->
<property>
<name>hbase.client.write.buffer</name>
<value>5242880</value> <!-- 5MB -->
</property>

<!-- 处理线程数调大 -->
<property>
<name>hbase.regionserver.handler.count</name>
<value>40</value>
</property>

<!-- MemStore 刷盘阈值调大 -->
<property>
<name>hbase.hregion.memstore.flush.size</name>
<value>268435456</value> <!-- 256MB -->
</property>

<!-- MemStore 内存占比调高 -->
<property>
<name>hbase.regionserver.global.memstore.upperLimit</name>
<value>0.45</value>
</property>

读取性能优化——“读得多”怎么调

场景特征: 用户画像查询、历史数据检索、报表查询。读 QPS 高,写少。

参数 默认值 推荐值(读密集) 为什么调 风险
hbase.client.scanner.caching 1 100-500 一次 RPC 返回多行,减少网络往返 设太大单次返回数据量大会 OOM
hbase.regionserver.handler.count 10 30-50 读请求也需要线程处理 同写密集
hfile.block.cache.size 0.4 0.5-0.6 更多内存给 BlockCache,缓存更多热数据 挤占 MemStore 内存

读密集场景配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- Scanner 缓存行数调大 -->
<property>
<name>hbase.client.scanner.caching</name>
<value>200</value>
</property>

<!-- BlockCache 占比调高 -->
<property>
<name>hfile.block.cache.size</name>
<value>0.5</value>
</property>

<!-- MemStore 占比相应调低 -->
<property>
<name>hbase.regionserver.global.memstore.upperLimit</name>
<value>0.35</value>
</property>

稳定性优化——“别动不动就挂”怎么调

这些参数不直接提升性能,但能避免集群崩溃。

参数 推荐值 解决什么问题
hbase.hregion.max.filesize 10GB(默认) Region 太大 → Split 慢 → 影响读写
hbase.regionserver.global.memstore.lowerLimit 0.38(默认) 刷盘到多少停止,避免频繁触发刷盘
hbase.hstore.compactionThreshold 3(默认) StoreFile 超过 3 个触发合并,设太大合并不及时影响读性能
hbase.hstore.blockingStoreFiles 10(默认) 超过 10 个 StoreFile 时阻塞写入,等合并完成,避免读性能雪崩

稳定性相关建议:

  • hbase.hregion.max.filesize 别设太小(比如 1GB),否则 Region 数量爆炸,元数据压力大
  • hbase.hstore.blockingStoreFiles 别设太大(比如 100),否则读请求会扫大量文件,RT 飙升

内存分配:MemStore vs BlockCache 怎么分

RegionServer 的堆内存主要分给三块:MemStore、BlockCache、其他。

text

1
2
3
4
堆内存分配:
├── MemStore(写缓存) → 默认 40%
├── BlockCache(读缓存) → 默认 40%
└── 其他(RPC、元数据) → 20%

调整原则:

业务特征 MemStore 占比 BlockCache 占比
写多读少 45-50% 30-35%
读多写少 30-35% 45-50%
混合负载 40% 40%
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- 写密集:MemStore 多分一点 -->
<property>
<name>hbase.regionserver.global.memstore.upperLimit</name>
<value>0.48</value>
</property>
<property>
<name>hfile.block.cache.size</name>
<value>0.32</value>
</property>

<!-- 读密集:BlockCache 多分一点 -->
<property>
<name>hbase.regionserver.global.memstore.upperLimit</name>
<value>0.32</value>
</property>
<property>
<name>hfile.block.cache.size</name>
<value>0.48</value>
</property>

欢迎关注我的其它发布渠道