随机数据分区和范围扫描
Random Data Partionning and range scan
因为HBase只有一个orderPartionner,有没有办法告诉HBase以随机方式存储数据以避免热点但仍然有可能根据时间进行范围扫描?
谢谢
您可以使用带盐的顺序分区器,在行键之前添加一些基于散列值的前缀。例如
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);
因为HBase只有一个orderPartionner,有没有办法告诉HBase以随机方式存储数据以避免热点但仍然有可能根据时间进行范围扫描?
谢谢
您可以使用带盐的顺序分区器,在行键之前添加一些基于散列值的前缀。例如
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);