更新时间:2024-05-28 GMT+08:00

HBase应用开发建议

不要调用Admin的closeRegion方法关闭一个Region

Admin中,提供了关闭一个Region的接口:

public void closeRegion(final String regionname, final String serverName)

通过该方法关闭一个Region,HBase Client端会直接发RPC请求到Region所在的RegionServer上,整个流程对Master而言,是不感知的。也就是说,尽管RegionServer关闭了这个Region,但是,在Master侧,还以为该Region是在该RegionServer上面打开的。假如,在执行Balance的时候,Master计算出恰好要转移这个Region,那么,这个Region将无法被关闭,本次转移操作将无法完成(关于这个问题,在当前的HBase版本中的处理的确还欠缺妥当)。

因此,暂时不建议使用该方法关闭一个Region。

采用PutList模式写数据

Table类中提供了两种写数据的接口:

  1. public void put(final Put put) throws IOException
  2. public void put(final List<Put> puts) throws IOException

第1种方法较之第2种方法,在性能上有明显的弱势。因此,写数据时应该采用第2种方法。

Scan时指定StartKey和EndKey

一个有确切范围的Scan,在性能上会带来较大的好处。

代码示例:

Scan scan = new Scan();
scan.addColumn(Bytes.toBytes("familyname"),Bytes.toBytes("columnname"));
scan.setStartRow( Bytes.toBytes("rowA")); // 假设起始Key为rowA
scan.setStopRow( Bytes.toBytes("rowB")); // 假设EndKey为rowB
for(Result result : demoTable.getScanner(scan)) {
// process Result instance
}

不要关闭WAL

WAL是Write-Ahead-Log的简称,是指数据在入库之前,首先会写入到日志文件中,借此来确保数据的安全性。

WAL功能默认是开启的,但是,在Put类中提供了关闭WAL功能的接口:

public void setWriteToWAL(boolean write)

因此,不建议调用该方法将WAL关闭(即将writeToWAL设置为False),因为可能会造成最近1S(该值由RegionServer端的配置参数“hbase.regionserver.optionallogflushinterval”决定,默认为1S)内的数据丢失。但如果在实际应用中,对写入的速率要求很高,并且可以容忍丢失最近1S内的数据的话,可以将该功能关闭。

创建一张表或Scan时设定blockcache为true

HBase客户端建表和scan时,设置blockcache=true。需要根据具体的应用需求来设定它的值,这取决于有些数据是否会被反复的查询到,如果存在较多的重复记录,将这个值设置为true可以提升效率,否则,建议关闭。

建议按默认配置,默认就是true,只要不强制设置成false就可以,例如:

HColumnDescriptor fieldADesc = new HColumnDescriptor("value".getBytes());
fieldADesc.setBlockCacheEnabled(false);

HBase不支持条件查询和Orderby等查询方法,存储按照字典排序,读取只支持Rowkey扫描

设计时应避免HBase随机查找、排序的应用场景。

业务表设计建议

  1. 预分Region,使Region分布均匀,提高并发
  2. 避免过多的热点Region。根据应用场景,可考虑将时间因素引入Rowkey。
  3. 同时访问的数据尽量连续存储。同时读取的数据相邻存储;同时读取的数据存放在同一行;同时读取的数据存放在同一cell。
  4. 查询频繁属性放在Rowkey前面部分。Rowkey的设计在排序上必须与主要的查询条件契合。
  5. 离散度较好的属性作为RowKey组成部分。分析数据离散度特点以及查询场景,综合各种场景进行设计。
  6. 存储冗余信息,提高检索性能。使用二级索引,适应更多查询场景。
  7. 利用过期时间、版本个数设置等操作,让表能自动清除过期数据。

在HBase中,一直在繁忙写数据的Region被称为热点Region。