multirowrangefilter:如何限制每个行范围的结果?

lnlaulya  于 2021-06-09  发布在  Hbase
关注(0)|答案(2)|浏览(291)

我正在尝试使用hbase MultiRowRangeFilter 以尽量减少重复扫描尝试到服务器的往返次数。但是,我不知道如何处理一个行范围可能有太多行的情况,这将阻止 Scan 从其他范围返回任何行。
例如,考虑具有以下行键结构和内容的表:

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 对于每个数组范围,最多返回2行 Bob|~| ?
现在,伪代码如下所示:

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 图形和省略设置 PageFilter(max)FilterList . 我们可以在客户端过滤结果,但表中可能有数百万行 Bob... 行键前缀,所以我们要限制 Scan 在服务器端。
如果我们指定 PageFilter(max) ,则如果表的行数大于 max 带前缀 Bob|1| ,则不返回任何带前缀的行 Bob|2| 等。
我们怎样才能做到最好?同样,我们的目标是做一件事 Scan 对于一次多个范围(为了改进当前重复执行的功能 Scans 对于每一个子键,这似乎是低效的)。理想情况下,这应该与hbase和bigtable一起工作,但至少其中一个会有所帮助!

368yc8dk

368yc8dk1#

不幸的是,本机不支持此功能。我最好的建议是并行发布行范围。这实际上会改善整体延迟,因为单个读取请求中的多个行范围是按顺序处理的。
由于每个rpc的开销,使用此路由将略微降低最大吞吐量。但是,如果您在每个范围内返回的行数多于一小部分,那么工作将由响应处理主导,因此您应该看不到太大的差异。

6ljaweal

6ljaweal2#

bob | 1将有多少行?如果它没有无限增长,那么您可以调整您的模式,使bob | 1是行键,是列名。然后可以使用columnpaginationfilter将列数限制为2?

相关问题