Что такое countofrowsfiltered в scanmetrics с hbase scan?

У меня есть таблица, которая подвергается интенсивным действиям при вставке и удалении, и мне нужно часто сканировать ее с помощью сканирования (только по ключу строки, без значений столбца).

Я заметил, что задержка 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();

После дальнейшего изучения, я думаю, что теперь понимаю немного больше: это действительно похоже на удаленные строки. ОДНАКО загадка в том, что они не исчезают даже после серьезного уплотнения! Это может быть связано с арендой сканирования, согласно этому обсуждению здесь: grokbase.com/t/hbase/user/165v9wvw8s/… Дальнейшее подтверждение состоит в том, что проблема исчезает после ручного разделения региона. Есть идеи, как это исправить? (кажется, я каждый раз закрываю сканы?)

VS_FF 13.09.2018 20:15
0
1
142
1

Ответы 1

Думаю, я нашел ответ:

Я выполнял Deletes, указав только rowKey (хотя у меня только один столбец в строке). В этом случае маркер удаления помещается в строку, и строка исключается из всех сканирований и получения, НО она остается физически присутствующей в базовой инфраструктуре даже после значительного сжатия. Таким образом, Scan тратит дополнительное время на итерацию этих удаленных строк и их фильтрацию, чтобы подготовить окончательный результат, исключающий их.

Похоже, что строка будет удалена из базовой инфраструктуры только в том случае, если Delete будет полностью квалифицирован RowKey, ColumnFamily, ColumnName, А ТАКЖЕTimeStamp из ВСЕ своих столбцов.

БОЛЕЕ ТОГО: кажется, недостаточно просто выполнить Основное уплотнение. Сначала таблица должна быть очищена, а ЗАТЕМ сильно уплотнена, и только затем удаленные строки полностью исчезнут, и Scan не тратит дополнительное время на их фильтрацию.

Это сложнее, чем я думал ...

Другие вопросы по теме