在使用HBase扫描的ScanMetrics中过滤的RowsCountOfRows究竟是多少?

在使用HBase扫描的ScanMetrics中过滤的RowsCountOfRows究竟是多少?,hbase,Hbase,我有一个表需要执行大量的插入和删除操作,我需要经常扫描它(只按行键,不按列值) 我注意到,Scan延迟随着表中数据量的增加而增加。在仔细检查了ScanMetrics之后,我注意到,对于大多数延迟更高的扫描,ScanMetrics.countOfRowsFiltered的测量值远高于我实际请求扫描的行数(我在scan和PageFilter()中指定了.setLimit())在我设置为扫描的过滤器列表中 countOfRowsFiltered的度量值究竟代表什么?在我的测试环境中,我无法再现扫描的行

我有一个表需要执行大量的插入和删除操作,我需要经常扫描它(只按行键,不按列值)

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

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();

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

我正在通过只指定
行键执行
删除
(即使行中只有一列)。在这种情况下,将在行上放置一个删除标记,并且该行将从所有扫描和GET中排除,但即使在主要压缩之后,该行仍将物理地存在于底层基础结构中。通过这种方式,
扫描
会花费额外的时间遍历这些删除的行,并将它们过滤掉,以准备排除它们的最终结果

看起来只有当
行键
列族
列名
列名
所有列的
时间戳
完全限定了
删除
,行才会从基础结构中删除

此外:仅进行主要压实似乎是不够的。首先需要刷新表,然后进行主压缩,只有这样删除的行才能完全消失,
Scan
才不会花费额外的时间过滤掉它们


这比我想象的要难…

在进一步挖掘之后,我想我现在理解得更多了:这似乎确实与删除的行有关。然而,神秘的是,即使在大面积压缩之后,它们也不会消失!根据这里的讨论,这可能与扫描租赁有关:进一步确认的是,在手动区域分割后,问题消失了。你知道怎么解决这个问题吗?(好像每次我都会关闭扫描?)