Кластер Azure HDInsight с Hbase + pheonix с использованием локального индекса - PullRequest
0 голосов
/ 05 декабря 2018

У нас есть кластер HDInsight, работающий с HBase (Ambari)

  1. Мы создали таблицу с использованием Pheonix

СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ Результаты (Col1 VARCHAR(255) NOT NULL, Col1 INTEGER NOT NULL, Col3 INTEGER NOT NULL, Назначение VARCHAR (255) NOT NULL, ОБЪЕДИНЕНИЕ pk ПЕРВИЧНЫЙ КЛЮЧ (Col1, Col2, Col3)) IMMUTABLE_ROWS = true

Мы заполнили некоторые данные в этой таблице (используя некоторый Java-код)

Позже мы решили создать локальный индекс для пункта назначения столбец следующим образом

СОЗДАТЬ ЛОКАЛЬНЫЙ ИНДЕКС DESTINATION_IDX ON RESULTS ( destination ) ASYNC

Мы запустили инструмент индексирования, чтобы заполнить индекс следующим образом

hbase org.apache.phoenix.mapreduce.index.IndexTool --data-table РЕЗУЛЬТАТЫ --index-tableDESTINATION_IDX - выходной путь DESTINATION_IDX_HFILES

Когда мы запускаем запросы и фильтруем по столбцам destination , все в порядке.Например,

выберите / * + NO_CACHE, SKIP_SCAN * / COL1, COL2, COL3, DESTINATION из результатов, где COL1 = «данные» DESTINATION = «некоторое значение»;

Но, если мы не используем DESTINATION в запросе where, мы получим исключение NullPointerException в BaseResultIterators.class

(из phoenix-core-4.7.0-HBase-1.1.jar)

Это исключение выдается только при использовании нового локального индекса.Если мы запросим игнорирование индекса, подобного этому

выберите / * + NO_CACHE, SKIP_SCAN, NO_INDEX * / COL1, COL2, COL3, DESTINATION из результатов, где COL1 = 'data ' DESTINATION =' some value ';

мы не получим исключение

Отображение некоторого соответствующего кода из области, где мы получаем исключение

...
catch (StaleRegionBoundaryCacheException e2) {
// Catch only to try to recover from region boundary cache being out of date
if (!clearedCache) { // Clear cache once so that we rejigger job based on new boundaries
                                services.clearTableRegionCache(physicalTableName);

context.getOverallQueryMetrics().cacheRefreshedDueToSplits();
}
// Resubmit just this portion of work again
Scan oldScan = scanPair.getFirst();
byte[] startKey = oldScan.getAttribute(SCAN_ACTUAL_START_ROW);
byte[] endKey = oldScan.getStopRow();

====================Note the isLocalIndex is true ==================
if (isLocalIndex) {
     endKey = oldScan.getAttribute(EXPECTED_UPPER_REGION_KEY);

    //endKey is null for some reason in this point and the next function 
    //will fail inside it with NPE

}

List<List<Scan>> newNestedScans = this.getParallelScans(startKey, endKey);

Мы должны использовать эту версию Jar, так как мы запускаем внутри Azure HDInsight, и мы не можем выбрать более новую версию Jar

Есть идеи, как решить эту проблему?Что означает «восстановление из устаревшего кеша границ региона»?похоже, это связано с проблемой

1 Ответ

0 голосов
/ 09 декабря 2018

Похоже, что версия Azure HDInsight для ядра Phoenix (phoenix-core-4.7.0.2.6.5.3004-13.jar) содержит ошибку, но если я использую немного более новую версию (phoenix-core-4.7.0.2.6.5.8-2.jar от http://nexus -private.hortonworks.com: 8081 / nexus / content / repositories / hwxreleases / org / apache / phoenix / phoenix-core / 4.7.0.2.6.5.8-2 / ) мы больше не видим ошибку

обратите внимание, что невозможно взять более новую версию, например 4.8.0, поскольку в этом случае сервер выдаст ошибку несоответствия версий

...