Что именно countOfRowsFiltered в ScanMetrics с HBase Scan? - PullRequest
0 голосов
/ 13 сентября 2018

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

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

1 Ответ

0 голосов
/ 13 сентября 2018

Мне кажется, я нашел ответ:

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

Похоже, что строка будет удалена только из базовой инфраструктуры, если Delete был полностью квалифицирован RowKey, ColumnFamily, ColumnName, AND TimeStamp из ALL его столбцов.

ДАЛЕЕ : кажется, что недостаточно просто выполнить Основное уплотнение.Сначала необходимо очистить таблицу, а затем сжать ее, и только после этого удаленные строки полностью исчезнут, и Scan не тратит дополнительное время на их фильтрацию.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...