首页 > 解决方案 > 使用 HBase 扫描的 ScanMetrics 中的 countOfRowsFiltered 到底是什么?

问题描述

我有一个表受到大量插入和删除操作的影响,我需要使用 Scans 经常扫描它(仅通过行键,没有列值)。

我注意到Scan延迟随着表中数据量的增加而增加。在仔细检查 后ScanMetrics,我注意到对于大多数延迟较高的扫描, 的测量值ScanMetrics.countOfRowsFiltered远高于我实际请求扫描的行数(我在设置为.setLimit()ScanPageFilter()中指定) .FilterListscan

量度究竟countOfRowsFiltered代表什么?在我的测试环境中,我永远无法重现扫描行数高于我设置的限制的情况,因此这countOfRowsFiltered始终为零。但在实际环境中,它经常很高(根据我的计算,这可能是整体扫描延迟逐渐增加的原因)。

我在外面找不到有关此措施的任何描述。任何经验,以及如何最小化它?

我设置我的扫描如下:

Scan scan = new Scan().withStartRow(rowKeyStart).withStopRow(rowKeyStop);
scan.setCaching(scanCache);
FilterList filterList = new FilterList(
        FilterList.Operator.MUST_PASS_ALL,
        new FirstKeyOnlyFilter(),
        new KeyOnlyFilter(),
        new PrefixFilter(myPrefix),
        new PageFilter(limit));     

scan.setFilter(filterList);
scan.setCacheBlocks(false);
scan.setLimit(limit);   
scan.setReadType(ReadType.PREAD); 

scan.setScanMetricsEnabled(true);
ResultScanner scanner = myTable.getScanner(m_scan);

int processed = 0;
for (Result row : m_scanner.next(limit))
{
    // do something with this row
    if (++processed >= limit)
        break;
}       

ScanMetrics sm = m_scanner.getScanMetrics();

long scanned = sm.countOfRowsScanned.get();
long filtered = sm.countOfRowsFiltered.get(); // WHAT IS THIS???

scanner.close();

标签: hbase

解决方案


我相信我已经找到了答案:

Deletes通过仅指定rowKey(即使我在行中只有一列)来执行。在这种情况下,将删除标记放在行上,并且从所有扫描和获取中排除该行,但即使在主要压缩之后它仍然物理存在于底层基础架构中。这样,将Scan花费额外的时间遍历那些已删除的行并将它们过滤掉以准备排除它们的最终结果。

看起来只有在, , , AND所有Delete完全限定的情况下,该行才会从底层基础架构中删除。RowKeyColumnFamilyColumnName TimeStamp

FURTHERMORE : 似乎仅仅做主要的压缩是不够的。首先需要对表进行刷新,然后进行主要压缩,然后才删除的行完全消失,Scan并且不会花费额外的时间将它们过滤掉。

这比我想象的要难...


推荐阅读