2016-11-13 100 views
2

在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)。

回答

0

關閉加密時會出現這種情況嗎?

有一個bug報告出現在ASF s3a客戶端(而不是EMR的),當文件系統列出的長度!=實際文件長度時,事情正在破壞。即:由於加密,列表中的文件長度>讀取中的長度。

我們無法在我們的測試中重現這一點,無論如何我們的結論是「文件系統不能這樣做」(事實上,這是Hadoop FS規範的基本要求:列出的len必須等於實際長度)。如果EMR代碼出錯,那麼它的驅動程序中的下游代碼無法處理

+0

它適用於未加密的對象 - 您可能處於正確的軌道上 - 因爲這是我在Presto中找到的一條評論代碼: //注意:對於加密對象,下面使用的S3ObjectSummary.size()不正確,然而,爲了獲得正確的大小,我們需要額外請求獲取 //用戶元數據,在這種情況下並不重要。 –

+0

如何關閉加密? –

+0

文件缺少「x-amz-unencrypted-content-length」元數據值。 Presto需要將其設置爲使用CSE –