Hive 什么会导致presto raise错误';分区元数据不可用';?

Hive 什么会导致presto raise错误';分区元数据不可用';?,hive,presto,Hive,Presto,我正在使用presto+hive,并使用一个外部表,使用HDFSWebAPI提供数据 这张桌子有点像 CREATE TABLE `mytable` ( `eventid` string, `group_id` string) PARTITIONED BY (`dt` string, `appid` string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/user/hive/warehouse/myd

我正在使用presto+hive,并使用一个外部表,使用HDFSWebAPI提供数据

这张桌子有点像

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将数据文件推送到该位置

/user/hive/warehouse/mydb.db/mytable/dt={dt}/appid={appid}/data.csv
它几乎在任何时候都可以正常工作,但偶尔当我通过presto启动查询时,它只会抛出一个异常“Partition metadata not available”

这个查询类似于

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)']}}
错误不会重复,只是偶尔发生。我认为(也经过测试),尝试查询一个空分区,或者一个不存在的分区,不会引起任何问题,它应该只返回空分区。在这个过程中,我没有删除任何分区

我搜索了internet,但没有找到任何关于“分区元数据不可用”错误的有用信息,因此我转向stackoverflow寻求帮助


什么会导致这样的错误?如何避免呢?或者,当我遇到这样的错误时,我应该重试该过程吗?

该错误消息不在当前代码库中,但查看旧代码时,当配置单元元存储不返回分区的任何数据时,就会发生这种情况。我猜您的Hive metastore(竞争条件)有问题,或者另一个进程在查询运行时删除了分区(Presto不会预先读取所有分区,而是在查询生命周期内根据需要加载它们)。谢谢@DainSundstrom,我将检查我的Presto和Hive版本我的Presto版本为0.151,其于2016年7月发布。我发现2016.11()的问题已经解决,似乎是相关的问题。所以我真的应该升级prestodb@再次感谢你。