我让 HBase 在独立模式下运行,并且在使用 Java API 查询表时遇到了一些问题。该表有几百万个条目(但可能会增长到数十亿),它们具有以下行键指标:
<UUID>-<Tag>-<Timestamp>
我使用两个比较操作过滤器来查询代表时间间隔的特定行范围。
Scan scan = new Scan();
RowFilter upperRowFilter = new RowFilter(CompareOp.LESS,
new BinaryComparator(securityId + eventType + intervalEnd)
.getBytes()));
RowFilter lowerRowFilter = new RowFilter(CompareOp.GREATER_OR_EQUAL,
new BinaryComparator(securityId + eventType + intervalStart)
.getBytes()));
FilterList filterList = new FilterList();
filterList.addFilter(lowerRowFilter);
filterList.addFilter(upperRowFilter);
scan.setFilter(filterList);
scanner = table.getScanner(scan);
result = scanner.next();
当我调用 ResultScanner#next() 方法时,一切正常,直到它到达通过过滤器指定的键范围的最后一行。在 ResultScanner 返回最后一行之前最多需要 40 秒,这在词法上小于行范围上限。
当我更改 filterList 中过滤器的顺序时
filterList.addFilter(lowerRowFilter);
filterList.addFilter(upperRowFilter);
至
filterList.addFilter(upperRowFilter);
filterList.addFilter(lowerRowFilter);
扫描仪最多需要 40 秒才能开始返回任何结果,但返回最后一行没有更多延迟,所以我认为延迟来自 CompareOp.LESS - 过滤器。
我知道解决此延迟的唯一方法是省略 upperRowFilter 并手动检查行键是否超出范围,但我确信一定有问题,因为我在搜索互联网时没有发现任何问题。
我也已经尝试通过缓存来摆脱它,但是当我使用的缓存大小小于返回的行数时,它不会改变任何东西,如果我使用的缓存大小大于返回的行数,则会延迟仍然存在,但在返回任何结果之前再次出现。
你知道什么会导致这种行为吗?我做错了还是我错过了什么?
提前致谢!