最佳实践

最近更新时间: 2026-03-13 09:03:00

HBase Row Key 设计原则

HBase中RowKey用来检索表中的记录,支持以下三种方式:

  1. 通过单个RowKey访问:即按照某个row key键值进行get操作;
  2. 通过RowKey的range进行scan:即通过设置startRowKey和endRowKey,在这个范围内进行扫描;
  3. 全表扫描:即直接扫描整张表中所有行记录。

在HBase中,RowKey可以是任意字符串,最大长度64KB,实际应用中一般为10~100bytes,存为byte[]字节数组,一般设计成定长的。
RowKey是按照字典序存储,因此,设计row key时,要充分利用这个排序特点,将经常一起读取的数据存储到一块,将最近可能会被访问的数据放在一块。
举个例子:如果最近写入HBase表中的数据是最可能被访问的,可以考虑将时间戳作为RowKey的一部分,由于是字典序排序,所以可以使用Long.MAX_VALUE - timestamp作为row key,这样能保证新写入的数据在读取时可以被快速命中。

RowKey规则

RowKey要尽可能的短,越小越好

当HBase的RowKey过长时,会对性能产生影响,因为HBase是基于Key-Value存储的数据库,RowKey越长,需要扫描的字节数就越多,查询和写入的效率就会降低。因此,我们需要考虑如何处理过长的RowKey。

以下是一些处理过长RowKey的方法:

  1. 缩短RowKey的长度:如果RowKey包含不必要的信息,可以考虑删除或缩短这些信息,以减少RowKey的长度。
  2. 使用Hash算法:可以使用Hash算法将RowKey转换为一个较短的值,例如,使用MD5、SHA-1等算法将RowKey转换到固定长度的值。
  3. 分解RowKey:如果RowKey包含多个部分,可以将其拆分成多个部分,以降低每个部分的长度。例如,将时间戳和设备ID作为两个部分,分别存储在RowKey的不同位置。
  4. 压缩RowKey:可以使用压缩算法,例如,LZ4、Snappy等算法,将RowKey压缩后存储,以减少存储空间和读写时间。

以上是处理过长RowKey的一些方法,具体方法需要根据实际情况进行选择。

RowKey要和业务场景相贴合,避免造成热点写入/读取问题

一般有下面这几种方案:

  1. 均匀分区:将数据均匀的分配到不同的分区中,这种方式适用于数据分布比较均匀的场景。
  2. 前缀分区:根据数据的前缀信息进行分区,这种方式适用于数据的前缀信息比较规律的场景。
  3. 范围分区:根据数据的范围信息进行分区,将数据按照一定的范围进行分区,这种方式适用于数据分布比较集中的场景。
  4. hash分区:根据数据的hash值进行分区,将数据均匀地分配到不同的分区中,这种方式适用于数据分布不均匀的场景。
  5. 自定义分区:根据业务需求自定义分区策略,根据不同的需求采用不同的分区方式,这种方式适用于特定的业务场景。
    以上是避免热点RowKey的一些方法,具体方法需要根据实际情况进行选择。

如何应对HBase集群状态异常

查看HBase Master UI,观察以下指标。

每台RegionServer的平均Region数量

  1. 数量过多(官方建议100,实际可以到500-800,超过1000就容易出问题)则需要进行扩容;
  2. 当Region过多时,可以调整以下参数进行优化:
    • hbase.regionserver.region.split.policy=org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy
    • hbase.increasing.policy.initial.size=5368709120 -- Region到达这个大小才会开始分裂
    • hbase.hregion.max.filesize=10737418240 -- Region最大值

是否存在一直无法上线的RIT Region

可尝试清理Master WALs和Zookeeper上的临时数据,再重启Master尝试:

  1. 停止所有Master服务;
  2. 删除HDFS上的/apps/hbase/data/MasterProcWALs目录;
  3. 进入zkcli,删除Zookeeper上/hbase-unsecure/region-in-transition;
  4. 启动所有Master服务;

Region分布是否均衡

每台RegionServer的Region数量不均衡,后台进入hbase shell执行均衡命令balancer_enabled值为false,需要手动开启:

  1. balancer_switch true
  2. balancer_enabled
  3. balancer
  4. 观察一段时间,如果还是不均衡,可考虑修改按Region数量进行均衡,然后重启Master服务:
    • hbase.master.loadbalance.bytable=true
    • hbase.master.loadbalancer.class=org.apache.hadoop.hbase.master.balancer.SimpleLoadBalancer

是否存在Region热点问题

某台RegionServer请求数较大,怀疑Region热点问题:

  1. 分析RegionServer具体哪个组件或者表的Region读写较多,比如OpenTSDB;
  2. 对于历史数据导入HBase操作,建议使用bulkload方式进行导入,增量导入可加大客户端缓存,减少RPC请求,降低HBase集群压力。