Что приведет к появлению ошибки «Метаданные раздела недоступны»? - PullRequest
0 голосов
/ 16 мая 2018

Я использую Presto + Hive, и использую внешнюю таблицу, кормить данные с помощью веб-API hdfs.

таблица напоминает

CREATE TABLE `mytable` (
    `eventid` string,
    `group_id` string)
PARTITIONED BY (`dt` string, `appid` string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','    
LOCATION '/user/hive/warehouse/mydb.db/mytable'

Я использую pyhive для создания раздела каждый раз перед передачей файла данных в hdfs

ALTER TABLE mydb.mytable 
    ADD IF NOT EXISTS PARTITION (dt='{dt}', appid='{appid}')

, затем использую hdfs web api push dataфайл в папку

/user/hive/warehouse/mydb.db/mytable/dt={dt}/appid={appid}/data.csv

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

запрос что-то вроде

select * 
from mytable
where dt='{dt}'
  and appid='{appid}'
  and eventid in ('...')

все сообщения об ошибках

DatabaseError: {'message': 'Partition metadata not available', 'errorCode': 16777216, 'errorName': 'HIVE_METASTORE_ERROR', 'errorType': 'EXTERNAL', 'failureInfo': {'type': 'com.facebook.presto.spi.PrestoException', 'message': 'Partition metadata not available', 'suppressed': [], 'stack': ['com.facebook.presto.hive.HiveSplitManager.lambda$getPartitionMetadata$1(HiveSplitManager.java:200)', 'com.google.common.collect.Iterators$8.transform(Iterators.java:799)', 'com.google.common.collect.TransformedIterator.next(TransformedIterator.java:48)', 'com.google.common.collect.TransformedIterator.next(TransformedIterator.java:48)', 'com.google.common.collect.Iterators$5.hasNext(Iterators.java:548)', 'com.facebook.presto.hive.ConcurrentLazyQueue.poll(ConcurrentLazyQueue.java:37)', 'com.facebook.presto.hive.BackgroundHiveSplitLoader.loadSplits(BackgroundHiveSplitLoader.java:219)', 'com.facebook.presto.hive.BackgroundHiveSplitLoader.access$300(BackgroundHiveSplitLoader.java:78)', 'com.facebook.presto.hive.BackgroundHiveSplitLoader$HiveSplitLoaderTask.process(BackgroundHiveSplitLoader.java:179)', 'com.facebook.presto.hive.util.ResumableTasks.safeProcessTask(ResumableTasks.java:45)', 'com.facebook.presto.hive.util.ResumableTasks.lambda$submit$1(ResumableTasks.java:33)', 'io.airlift.concurrent.BoundedExecutor.drainQueue(BoundedExecutor.java:77)', 'java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)', 'java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)', 'java.lang.Thread.run(Thread.java:745)']}}

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

Я искал в Интернете, но не нашел никакой полезной информации об ошибке «Метаданные раздела недоступны», поэтому я обращаюсь к stackoverflow за помощью.

что вызовет такую ​​ошибку?как этого избежать?или когда я встречаю такую ​​ошибку, я должен просто повторить процесс?

...