hbase - 使用 HBase 扫描的 ScanMetrics 中的 countOfRowsFiltered 到底是什么?
问题描述
我有一个表受到大量插入和删除操作的影响,我需要使用 Scans 经常扫描它(仅通过行键,没有列值)。
我注意到Scan
延迟随着表中数据量的增加而增加。在仔细检查 后ScanMetrics
,我注意到对于大多数延迟较高的扫描, 的测量值ScanMetrics.countOfRowsFiltered
远高于我实际请求扫描的行数(我在设置为.setLimit()
的Scan
和PageFilter()
中指定) .FilterList
scan
量度究竟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();
解决方案
我相信我已经找到了答案:
我Deletes
通过仅指定rowKey
(即使我在行中只有一列)来执行。在这种情况下,将删除标记放在行上,并且从所有扫描和获取中排除该行,但即使在主要压缩之后它仍然物理存在于底层基础架构中。这样,将Scan
花费额外的时间遍历那些已删除的行并将它们过滤掉以准备排除它们的最终结果。
看起来只有在, , , AND的所有列Delete
完全限定的情况下,该行才会从底层基础架构中删除。RowKey
ColumnFamily
ColumnName
TimeStamp
FURTHERMORE : 似乎仅仅做主要的压缩是不够的。首先需要对表进行刷新,然后进行主要压缩,然后才删除的行完全消失,Scan
并且不会花费额外的时间将它们过滤掉。
这比我想象的要难...
推荐阅读
- haskell - repmin 如何在 Haskell 的树中放置值?
- python - 如何在 Python 中抓取 javascript 网站?
- database - postgrator:迁移 postgresql 数据库时未找到
- python - Python JSON 数据横向
- sql - 在 EF Core 3.1.1 中加入 3 个表并使用带有 linq 的左外连接
- laravel - 如何在 laravel-modules 下新建迁移文件?
- cmake - 如何手动将 CMake 路径变量设置为 NOTFOUND?
- c++ - c ++ 20如何制作一个像容器一样的约束元组,它只包含允许的类型和自身的一个实例
- html - HTML 表格宽度按比例设置
- html - 从 Django 应用程序将 QuickChart.io 图像嵌入 HTML