Hbase范围扫描,同时消除区域服务器热点

Hbase范围扫描,同时消除区域服务器热点,hbase,Hbase,我有一个hbase表,行键类似于。其中时间戳为yyyyMMddHHmm。我关心的是查询给定时间范围内的用户详细信息 例如:“201602021310_用户1” HTable table=新的HTable(conf,tableName); 扫描s=新扫描(); s、 setStartRow(“20160202.getBytes()); s、 setStopRow(“20160303.getBytes()); ResultScanner ss=table.getScanner(s); List rs

我有一个hbase表,行键类似于
其中时间戳为yyyyMMddHHmm。我关心的是查询给定时间范围内的用户详细信息

例如:“201602021310_用户1”

HTable table=新的HTable(conf,tableName);
扫描s=新扫描();
s、 setStartRow(“20160202.getBytes());
s、 setStopRow(“20160303.getBytes());
ResultScanner ss=table.getScanner(s);
List rs=new ArrayList();
对于(结果r:ss){
rs.add(r);
}
根据我的理解,不会有任何问题,因为Hbase按字典顺序存储数据。但此实现将导致区域服务器热点问题。 为了避免热点问题,(期待评论)

  • 我正在考虑在我的行键中使用一个哈希前缀。如果是这样的话,我感觉我的范围扫描将无法像我所希望的那样工作
  • 然后使用过滤类似模糊过滤器。但我找不到一种方法来实现射程酷似。 根据我的理解,我可以通过这项工作实现每月的过滤和合并结果。
    201602????
    20160301??????+
    20160302????
    +
    20160303??????
  • 实现这一目标的最佳途径是什么?(在支持范围酷似的同时消除热点)

    在哪里,

    • 索引-特定记录/行ID的数字(或任何顺序)部分
    • bucket\u NUMBER-我们希望新行键分布的“bucket”数
    • original_key—我们要写入的记录的原始密钥
    Bucked记录的新行键将不再在一个序列中,但每个bucket中的记录将保留其原始序列。由于数据在写入期间被放置在多个存储桶中,因此在基于“原始”开始键和停止键进行扫描时,我们必须从所有这些存储桶中读取数据,并合并数据,以便保留“排序”属性。每个存储桶的扫描可以并行化,因此性能不会降低

    摘自Sematext博客文章

    你可以阅读这篇文章以获得完整的答案/解释

    HTable table = new HTable(conf, tableName);
            Scan s = new Scan();
            s.setStartRow("20160202".getBytes());
            s.setStopRow("20160303".getBytes());
            ResultScanner ss = table.getScanner(s);
            List<Result> rs = new ArrayList<Result>();
            for(Result r:ss){
                rs.add(r);
            }
    
    row_key = (++index % BUCKETS_NUMBER) + original_key