我正在使用presto + hive,并使用外部表,使用hdfs web api提供数据。
表格就像
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'
每次在将数据文件推送到hdfs之前使用pyhive来创建分区
ALTER TABLE mydb.mytable
ADD IF NOT EXISTS PARTITION (dt='{dt}', appid='{appid}')
然后使用hdfs web api push数据文件到位置
/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寻求帮助。
什么会导致这种错误?怎么避免呢?或者当我遇到这样的错误时,我应该重试这个过程吗?