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

Hbase range scan while eliminating region server hot spotting

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

例如:“201602021310_user1”

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 按字典顺序存储数据。但是这个实现会造成region server hot spotting。 为了避免热点,(期待评论)

  1. 我正在考虑在我的行键中使用 散列前缀。如果是这样,我觉得我的 范围扫描将无法正常工作
  2. 然后使用过滤,例如模糊过滤器。但是我找不到实现范围查询的方法。 根据我的低估,我可以通过此实现的是过滤每个月并合并结果。 201602??_?????? + 20160301_?????? +20160302_??????+20160303_??????

实现此目标的最佳方法是什么? (在支持范围查询的同时消除热点)

row_key = (++index % BUCKETS_NUMBER) + original_key

其中,

  • index - 特定 record/row ID 的数字(或任何顺序)部分。
  • BUCKETS_NUMBER - 我们希望新行键分布在“桶”的数量。
  • original_key - 我们要写入的记录的原始键。

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

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

您可以完整阅读本文answer/explanation