У нас есть кластер HDInsight, работающий с HBase (Ambari)
- Мы создали таблицу с использованием 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
Есть идеи, как решить эту проблему?Что означает «восстановление из устаревшего кеша границ региона»?похоже, это связано с проблемой