【问题标题】:MultiRowRangeFilter: how to limit results per RowRange?MultiRowRangeFilter:如何限制每个 RowRange 的结果?
【发布时间】:2018-07-27 10:16:26
【问题描述】:

我正在尝试利用 HBase MultiRowRangeFilter 来最大程度地减少重复扫描尝试到服务器的往返次数。但是,我不知道如何处理一个 Row Range 可能有太多行的情况,这会阻止 Scan 从其他范围返回任何行。

例如,考虑具有以下 Row Key 结构和内容的表:

Bob|1|XXX (XXX is some random sequence)
Bob|1|XXX
Bob|1|XXX
Bob|2|XXX
Bob|2|XXX
Bob|2|XXX
Bob|3|XXX
Bob|3|XXX
Bob|3|XXX

我如何在上表中执行Scan,它会在Bob|~| 的每个范围内返回 MAXIMUM 2 行?

现在虚拟代码看起来像这样:

private void getRanges(Table tbl, Integer max) throws IOException
{
    List<RowRange> rowrangeList = new ArrayList<RowRange>();
    for (Integer i = 1; i <= 3; i++)
    {
        String rowKey = "Bob|" + i;
        RowRange rowRange = new RowRange(rowKey.getBytes(), true, rowKey.getBytes(), true);
        rowrangeList.add(rowRange);
    }

    FilterList fList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
    fList.addFilter(new KeyOnlyFilter());
    fList.addFilter(new FirstKeyOnlyFilter());
    fList.addFilter(new PageFilter(max));
    fList.addFilter(new MultiRowRangeFilter(rowrangeList));

    Scan s = new Scan();
    s.setFilter(fList);

    ResultScanner scanner = tbl.getScanner(s);
    for (Result row : scanner)
    {
        System.out.println("Got row: " + new String(row.getRow()));
    }
    scanner.close();
}

但这里有问题:

如果我们不指定max 数字并在FilterList 中省略设置PageFilter(max),这将起作用。我们可以在客户端过滤结果,但表可能有数百万行带有Bob... 行键前缀,因此我们希望在服务器端限制Scan 的结果。

如果我们指定PageFilter(max),那么如果表的行数多于max,前缀为Bob|1|,那么我们将不会返回任何前缀为Bob|2|等的行。

我们怎样才能最好地做到这一点?同样,目标是一次为多个范围执行一个Scan(以改进当前为每个子键执行重复Scans 的功能,这似乎效率低下)。理想情况下,这应该适用于 HBase 和 Bigtable,但至少其中一个会有所帮助!

【问题讨论】:

    标签: hbase google-cloud-bigtable


    【解决方案1】:

    很遗憾,本机不支持此功能。我最好的建议是并行发布行范围。这实际上会改善您的整体延迟,因为单个读取请求中的多个行范围是按顺序处理的。

    由于每个 RPC 的开销,走这条路线会略微降低您的最大吞吐量。但是,如果您在每个范围内流回多于几行,则工作将由响应处理主导,因此您应该不会看到太大差异。

    【讨论】:

    • 感谢您的建议。不幸的是,这段代码 sn-p 本来打算在 Spark 中的 Worker 级别上运行(即,它不能从这个阶段进一步并行化)。不过,这在 Beam 中可能是可能的,我们稍后可能会使用它。
    【解决方案2】:

    Bob|1 将有多少行?如果它没有无限增长,那么也许您可以调整您的架构,以便 Bob|1 是行键,而 XXX 是列名。那你可以使用ColumnPaginationFilter来限制列数为2?

    【讨论】:

    • 感谢您的建议。不幸的是,我不能以这种方式更改模式,因为可能有很多 Bob|1 行,所以不会是唯一的。但是感谢您提出 ColumnPaginationFilter -- 它可能对这里的其他目的有用......
    猜你喜欢
    • 1970-01-01
    • 2020-02-27
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    相关资源
    最近更新 更多