【问题标题】:Hbase range scan while eliminating region server hot spottingHbase 范围扫描同时消除区域服务器热点
【发布时间】:2016-06-13 12:03:30
【问题描述】:

我有一个 hbase 表,行键类似于<<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 按字典顺序存储数据,因此不会有任何问题。但是这种实现会导致区域服务器热点。 为了避免热点,(期望cmets)

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

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

【问题讨论】:

    标签: hbase


    【解决方案1】:
    row_key = (++index % BUCKETS_NUMBER) + original_key
    

    在哪里,

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

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

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

    您可以阅读本文以获得完整的答案/解释

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多