快速上手NoSQL数据库HBase-3
5 HBase调优策略和扩展内容
HBase 调忧策略
预分区
1 | HBase默认新建的表中只有一个Region,这个Region的Rowkey是没有边界的,即没有startRowkey和endRowkey,在数据写入时,所有数据都会写入这个默认的Region |
1 | 基于此我们可以控制在建表的时候,创建多个空Region,并确定每个Region的起始和终止Rowkey,这样只要我们设计的Rowkey能均匀的命中各个Region,就不会存在写热点问题。Region分裂的几率也会大大降低。当然随着数据量的不断增长,该分裂还是要进行分裂的。 |
1 | 到HBase的界面中查看这个表的region信息 |


1 | 通过这个图可以看出来,此时创建的这个表会提前创建多个Region。 |

RowKey的设计原则
Rowkey长度原则
1 | Rowkey底层存储是一个二进制流,可以是任意字符串,最大长度 64kb ,实际应用中一般是10-100字节,以byte[]形式保存,一般设计为定长。 |
Rowkey散列原则
1 | Rowkey散列原则,主要是为了避免数据热点问题。 |
Rowkey唯一性原则
1 | 必须在设计上保证其唯一性,因为Rowkey相同则会覆盖 |
列族的设计原则
1 | 在设计列族的时候,建议把经常读取的字段存储到一个列族中,不经常读取的字段放到另一个列族中。 |
批量处理
1 | Table.get(Get)方法可以根据一个指定的Rowkey获取一行记录,同样HBase提供了另一个方法:通过调用Table.get(List)方法可以根据一个指定的Rowkey列表,批量获取多行记录,这样做的好处是批量执行,只需要一次网络IO开销,这样可以带来明显的性能提升。 |
Region的request计数
1 | HBase UI界面table Regions中的Requests参数值 |


HBase核心参数优化
1 | hbase.hregion.majorcompaction |
1 | 这些参数其实偏向于运维岗位的范畴,开发人员可以作为了解即可。 |

HBase扩展内容
【扩展】Hive与HBase 整合
1 | Hive提供了与HBase的集成,可以在HBase表上使用HQL语句进行查询,插入操作以及进行join和union等复杂查询。 |
【扩展】Phoenix(凤凰)
1 | Phoenix是构建在HBase上的一个SQL层,可以用标准的JDBC APIs来创建表,插入数据和对数据进行查询。 |
【扩展】协处理器coprocessor
1 | HBase作为列族数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执行求和、计数、排序等操作。 |
【扩展】Elasticsearch + HBase
1 | HBase里面只有RowKey作为一级索引, 如果要对表里的非RowKey字段进行数据检索和查询, 往往要通过MapReduce/Spark等分布式计算框架进行,硬件资源消耗和时间延迟都会比较高。 |
【扩展】HBase实现分页功能
1 | 核心思路: |
1 | 代码如下: |
【扩展】封装HBaseUtils工具类
1 | 要求: |
1 | import org.apache.hadoop.conf.Configuration; |
HBase常见问题总结
1 | -HBase Put 功能初始化数据过慢,考虑使用批量导入。 |