Presto не может запросить таблицу куста

В EMR я создал набор данных в паркете, используя Spark, и сохранил его на S3. В настоящее время я могу создать внешнюю таблицу и запросить ее с помощью улья, но когда я пытаюсь выполнить тот же запрос с помощью 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).


person Sebastiano Merlino    schedule 13.11.2016    source источник


Ответы (1)


Это всплывает при выключенном шифровании?

Было обнаружено сообщение об ошибке для клиента ASF s3a (не для EMR), где что-то ломалось, когда в файловой системе указывалась длина! = Фактическая длина файла. То есть: из-за шифрования длина файла в списке была> длины чтения.

Мы не смогли воспроизвести это в наших тестах, и в любом случае мы пришли к выводу, что «файловые системы не должны этого делать» (действительно, это фундаментальное требование спецификации Hadoop FS: указанное значение len должно равняться фактической длине). Если код EMR ошибается, значит, это что-то в их драйвере, что не может быть обработано нижестоящим кодом.

person stevel    schedule 15.11.2016
comment
Он работает с незашифрованными объектами - возможно, вы на правильном пути - поскольку это комментарий, который я нахожу в коде Presto: // ПРИМЕЧАНИЕ: для зашифрованных объектов S3ObjectSummary.size (), используемый ниже, НЕ является правильным, // однако, чтобы получить правильный размер, который нам понадобится, чтобы // сделать дополнительный запрос на получение метаданных пользователя, и в этом случае это не имеет значения. - person Sebastiano Merlino; 16.11.2016
comment
Как отключить шифрование? - person Rodrigo Ney; 18.11.2016
comment
В файлах отсутствовало значение метаданных x-amz-unencrypted-content-length. Presto необходимо настроить правильную работу с файлами, зашифрованными с помощью CSE. - person Sebastiano Merlino; 21.11.2016
comment
Значит, реальный размер указан в заголовке, но ничего не возвращается в операции листинга? Это беда, глубокая беда, так как в делах так работать не должно. - person stevel; 22.11.2016
comment
Да, немного сложным способом - как только файлы записываются в S3 в стиле hadoop с помощью EMR-FS, мой скрипт загружает части (неявно не шифруя) и повторно загружает их, устанавливая заголовок x-amz-unencrypted-content -length (на самом деле я выдаю s3-копию в том же месте, но устанавливаю заголовок, чтобы сэкономить время загрузки). - person Sebastiano Merlino; 27.01.2017