1

我让 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 并手动检查行键是否超出范围,但我确信一定有问题,因为我在搜索互联网时没有发现任何问题。

我也已经尝试通过缓存来摆脱它,但是当我使用的缓存大小小于返回的行数时,它不会改变任何东西,如果我使用的缓存大小大于返回的行数,则会延迟仍然存在,但在返回任何结果之前再次出现。

你知道什么会导致这种行为吗?我做错了还是我错过了什么?

提前致谢!

4

1 回答 1

1

问题是您的扫描仪正在扫描整个表格并丢弃与您的查询不匹配的结果。您需要显式设置 (securityId + eventType + intervalEnd) 的停止行。如果您设置相应的起始行 (securityId + eventType + intervalStart),那么您根本不需要过滤器,并且无论您的数据集大小如何,扫描都将是有效的。

于 2011-08-24T22:48:38.187 回答