原因HBase只有一个orderPartionner,有没有办法告诉HBase以随机方式存储数据以避免热点但仍有可能根据时间进行范围扫描?
感谢
答案 0 :(得分:2)
您可以使用带盐的订单分区程序,在行键之前根据哈希值添加一些前缀。 E.g。
Integer salt = rowKey.hashCode() % numberOfSalts;
Put put = new Put(Bytes.toBytes(salt + "|" + rowKey));
//add some data to you put
...
numberOfSalts
被视为使用顺序键进行批量写入所涉及的区域数。例如,如果10个区域可以处理您的写入量,则应在此公式中使用numberOfRegions
等于10,或者如果将来建议将写入次数加倍,则应使用20。
在此之后,您可以使用以下代码扫描基于范围。
List<Scan> scans = new ArrayList<>();
for(int salt = 0; salt < numberOfSalts; salt++){
Scan scan = new Scan();
scan.setBatch(500);
scan.setAttribute(Scan.SCAN_ATTRIBUTES_TABLE_NAME, YOUR_TABLE_NAME);
String salt = StringUtils.leftPad(Integer.toString(i), 3, "0");
scan.setStartRow( Bytes.toBytes(salt + "|" + scanStart));
scan.setStartRow( Bytes.toBytes(salt + "|" + scanStop);
scans.add(scan);
}
TableMapReduceUtil.initTableMapperJob(
scans,
YourMapper.class,
Text.class,
Text.class,
job);