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

时间:2016-03-01 07:06:03

标签: hbase

我有一个hbase表,行键就像<<timestamp>>_<<user_id>>,其中时间戳是yyyyMMddHHmm。我关心的是在给定的时间范围内查询用户详细信息

例如:&#34; 201602021310_user1&#34;

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);
        }

根据我的理解,由于Hbase按字典顺序存储数据,因此不会出现任何问题。但是这种实现会导致区域服务器热点。 为了避免热点,(期待评论)

  1. 我想在我的行键中使用哈希前缀。如果是这样,我觉得我的范围扫描无法正常工作
  2. 然后使用过滤,例如模糊过滤器。但我无法找到实现范围排队的方法。 根据我的不足,通过这个我可以实现的目的是过滤每个月并合并结果。 201602??_?????? + 20160301_?????? + 20160302_?????? + 20160303_??????
  3. 实现这一目标的最佳方法是什么? (在支持范围排队时消除热点)

1 个答案:

答案 0 :(得分:1)

row_key = (++index % BUCKETS_NUMBER) + original_key

其中,

  • index - 特定记录/行ID的数字(或任何顺序)部分。
  • BUCKETS_NUMBER - 我们希望新行密钥分散的“桶”数。
  • original_key - 我们要写的记录的原始密钥。

分段记录的新行键将不再是一个序列,但每个桶中的记录将保留其原始序列。由于数据在写入期间被放置在多个存储桶中,因此在根据“原始”启动和停止键进行扫描并合并数据时,我们必须从所有这些存储桶中读取数据,以便保留“已排序”属性。每个存储桶的扫描可以并行化,因此性能不会降低。

摘自Sematext博客文章HBaseWD: Avoid RegionServer Hotspotting Despite Sequential Keys

您可以阅读此内容以获得完整的答案/解释