hbase - MultiRowRangeFilter:如何限制每个 RowRange 的结果?
问题描述
我正在尝试利用 HBaseMultiRowRangeFilter
来最大程度地减少重复扫描尝试到服务器的往返次数。但是,我不知道如何处理一个 Row Range 可能有太多行的情况,这会阻止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
每个范围内返回 MAXIMUM 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,但至少其中一个会有所帮助!
解决方案
不幸的是,本机不支持此功能。我最好的建议是并行发布行范围。这实际上会改善您的整体延迟,因为单个读取请求中的多个行范围是按顺序处理的。
由于每个 RPC 的开销,走这条路线会略微降低您的最大吞吐量。但是,如果您在每个范围内流回的行数超过几行,则工作将由响应处理主导,因此您应该不会看到太大的差异。
推荐阅读
- angular - 如何在 Angular 组件中为 ActionsSubject 订阅编写单元测试
- python - 如何使用 for 循环创建多个 django-leaflet 实例?
- python - 为什么我不能从同一个客户收到两次
- google-apps-script - Replace conditonal formating with script, moving rows creates a mess
- javascript - How do I test the method shouldComponentUpdate?
- javascript - Render Component every time it's get clicked
- angular - Angular S3 Static Website - 403 Forbidden Routing Error
- angular - 带有公开参数的构造函数解构
- java - How I add a regex function to SQLite in Spring JPA?
- android - Syntax Error using Vacuum Into on Android