随机数据分区和范围扫描

时间:2016-01-11 09:40:24

标签: hbase

原因HBase只有一个orderPartionner,有没有办法告诉HBase以随机方式存储数据以避免热点但仍有可能根据时间进行范围扫描?

感谢

1 个答案:

答案 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);