Кластер Azure HDInsight с Hbase + pheonix с использованием локального индекса

У нас есть кластер HDInsight с HBase (Ambari)

  1. Мы создали таблицу с помощью Pheonix

СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ Результаты (Col1 VARCHAR (255) NOT NULL, Col1 INTEGER NOT NULL, Col3 INTEGER NOT NULL, Destination VARCHAR (255) NOT NULL CONSTRAINT pk PRIMARY KEY (Col1, Col2, Col3) ) IMMUTABLE_ROWS = истина

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

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

СОЗДАТЬ ЛОКАЛЬНЫЙ ИНДЕКС DESTINATION_IDX ПО РЕЗУЛЬТАТАМ (пункт назначения) ASYNC

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

hbase org.apache.phoenix.mapreduce.index.IndexTool --data-table RESULTS --index-table DESTINATION_IDX --output-path DESTINATION_IDX_HFILES

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

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

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

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

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

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

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

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

...
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);
  1. Мы должны использовать эту версию Jar, поскольку мы работаем внутри Azure HDInsight, и мы не можем выбрать более новую версию JAR.

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


person Maayan Hope    schedule 05.12.2018    source источник


Ответы (1)


Похоже, что версия 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, так как в этом случае сервер выдаст ошибку несоответствия версии

person Maayan Hope    schedule 09.12.2018