Presto无法查询配置单元表

Presto无法查询配置单元表

问题描述:

在EMR上,我使用spark在parquet中创建了一个数据集并将其存储在S3上。 我目前能够创建一个外部表并使用配置单元查询它,但是当我尝试使用presto执行相同的查询时,我得到一个错误(该部分在每次运行时引用了更改)。Presto无法查询配置单元表

2016-11-13T13:11:15.165Z  ERROR remote-task-callback-36 com.facebook.presto.execution.StageStateMachine Stage 20161113_131114_00004_yp8y5.1 failed 
com.facebook.presto.spi.PrestoException: Error opening Hive split s3://my_bucket/my_table/part-r-00013-b17b4495-f407-49e0-9d15-41bb0b68c605.snappy.parquet (offset=1100508800, length=68781800): null 
     at com.facebook.presto.hive.parquet.ParquetHiveRecordCursor.createParquetRecordReader(ParquetHiveRecordCursor.java:475) 
    at com.facebook.presto.hive.parquet.ParquetHiveRecordCursor.<init>(ParquetHiveRecordCursor.java:247) 
    at com.facebook.presto.hive.parquet.ParquetRecordCursorProvider.createHiveRecordCursor(ParquetRecordCursorProvider.java:96) 
    at com.facebook.presto.hive.HivePageSourceProvider.getHiveRecordCursor(HivePageSourceProvider.java:129) 
    at com.facebook.presto.hive.HivePageSourceProvider.createPageSource(HivePageSourceProvider.java:107) 
    at com.facebook.presto.spi.connector.classloader.ClassLoaderSafeConnectorPageSourceProvider.createPageSource(ClassLoaderSafeConnectorPageSourceProvider.java:44) 
    at com.facebook.presto.split.PageSourceManager.createPageSource(PageSourceManager.java:48) 
    at com.facebook.presto.operator.TableScanOperator.createSourceIfNecessary(TableScanOperator.java:268) 
    at com.facebook.presto.operator.TableScanOperator.isFinished(TableScanOperator.java:210) 
    at com.facebook.presto.operator.Driver.processInternal(Driver.java:375) 
    at com.facebook.presto.operator.Driver.processFor(Driver.java:301) 
    at com.facebook.presto.execution.SqlTaskExecution$DriverSplitRunner.processFor(SqlTaskExecution.java:622) 
    at com.facebook.presto.execution.TaskExecutor$PrioritizedSplitRunner.process(TaskExecutor.java:529) 
    at com.facebook.presto.execution.TaskExecutor$Runner.run(TaskExecutor.java:665) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.io.EOFException 
    at java.io.DataInputStream.readFully(DataInputStream.java:197) 
    at java.io.DataInputStream.readFully(DataInputStream.java:169) 
    at parquet.hadoop.ParquetFileReader.readFooter(ParquetFileReader.java:420) 
    at parquet.hadoop.ParquetFileReader.readFooter(ParquetFileReader.java:385) 
    at com.facebook.presto.hive.parquet.ParquetHiveRecordCursor.lambda$createParquetRecordReader$0(ParquetHiveRecordCursor.java:416) 
    at com.facebook.presto.hive.authentication.NoHdfsAuthentication.doAs(NoHdfsAuthentication.java:23) 
    at com.facebook.presto.hive.HdfsEnvironment.doAs(HdfsEnvironment.java:76) 
    at com.facebook.presto.hive.parquet.ParquetHiveRecordCursor.createParquetRecordReader(ParquetHiveRecordCursor.java:416) 
    ... 16 more 

镶木地板位置由128个部分组成 - 数据存储在S3上并使用KMS客户端加密进行加密。 Presto使用自定义加密材质提供程序(使用presto.s3.encryption-materials-provider指定),该提供程序仅返回用我的主密钥初始化的KMSEncryptionMaterials对象。我正在使用EMR 5.1.0(Hive 2.1.0,Spark 2.0.1,Presto 0.152.3)。

关闭加密时会出现这种情况吗?

有一个bug报告出现在ASF s3a客户端(而不是EMR的),当文件系统列出的长度!=实际文件长度时,事情正在破坏。即:由于加密,列表中的文件长度>读取中的长度。

我们无法在我们的测试中重现这一点,无论如何我们的结论是“文件系统不能这样做”(事实上,这是Hadoop FS规范的基本要求:列出的len必须等于实际长度)。如果EMR代码出错,那么它的驱动程序中的下游代码无法处理

+0

它适用于未加密的对象 - 您可能处于正确的轨道上 - 因为这是我在Presto中找到的一条评论代码: //注意:对于加密对象,下面使用的S3ObjectSummary.size()不正确,然而,为了获得正确的大小,我们需要额外请求获取 //用户元数据,在这种情况下并不重要。 –

+0

如何关闭加密? –

+0

文件缺少“x-amz-unencrypted-content-length”元数据值。 Presto需要将其设置为使用CSE –