Ошибка EntityTooLarge при загрузке 5G-файла в Amazon S3

8

Ограничение размера файла Amazon S3 должно быть 5T в соответствии с этим объявлением , но я получаю следующую ошибку при загрузке файла 5G

'/mahler%2Fparquet%2Fpageview%2Fall-2014-2000%2F_temporary%2F_attempt_201410112050_0009_r_000221_2222%2Fpart-r-222.parquet' XML Error Message: 
  <?xml version="1.0" encoding="UTF-8"?>
  <Error>
    <Code>EntityTooLarge</Code>
    <Message>Your proposed upload exceeds the maximum allowed size</Message>
    <ProposedSize>5374138340</ProposedSize>
    ...
    <MaxSizeAllowed>5368709120</MaxSizeAllowed>
  </Error>

Это похоже на то, что S3 принимает только 5G-загрузки. Я использую Apache Spark SQL для записи набора данных Parquet с использованием метода SchemRDD.saveAsParquetFile . Полная трассировка стека

org.apache.hadoop.fs.s3.S3Exception: org.jets3t.service.S3ServiceException: S3 PUT failed for '/mahler%2Fparquet%2Fpageview%2Fall-2014-2000%2F_temporary%2F_attempt_201410112050_0009_r_000221_2222%2Fpart-r-222.parquet' XML Error Message: <?xml version="1.0" encoding="UTF-8"?><Error><Code>EntityTooLarge</Code><Message>Your proposed upload exceeds the maximum allowed size</Message><ProposedSize>5374138340</ProposedSize><RequestId>20A38B479FFED879</RequestId><HostId>KxeGsPreQ0hO7mm7DTcGLiN7vi7nqT3Z6p2Nbx1aLULSEzp6X5Iu8Kj6qM7Whm56ciJ7uDEeNn4=</HostId><MaxSizeAllowed>5368709120</MaxSizeAllowed></Error>
        org.apache.hadoop.fs.s3native.Jets3tNativeFileSystemStore.storeFile(Jets3tNativeFileSystemStore.java:82)
        sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        java.lang.reflect.Method.invoke(Method.java:606)
        org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:82)
        org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:59)
        org.apache.hadoop.fs.s3native.$Proxy10.storeFile(Unknown Source)
        org.apache.hadoop.fs.s3native.NativeS3FileSystem$NativeS3FsOutputStream.close(NativeS3FileSystem.java:174)
        org.apache.hadoop.fs.FSDataOutputStream$PositionCache.close(FSDataOutputStream.java:61)
        org.apache.hadoop.fs.FSDataOutputStream.close(FSDataOutputStream.java:86)
        parquet.hadoop.ParquetFileWriter.end(ParquetFileWriter.java:321)
        parquet.hadoop.InternalParquetRecordWriter.close(InternalParquetRecordWriter.java:111)
        parquet.hadoop.ParquetRecordWriter.close(ParquetRecordWriter.java:73)
        org.apache.spark.sql.parquet.InsertIntoParquetTable.org$apache$spark$sql$parquet$InsertIntoParquetTable$$writeShard(ParquetTableOperations.scala:305)
        org.apache.spark.sql.parquet.InsertIntoParquetTable$$anonfun$saveAsHadoopFile.apply(ParquetTableOperations.scala:318)
        org.apache.spark.sql.parquet.InsertIntoParquetTable$$anonfun$saveAsHadoopFile.apply(ParquetTableOperations.scala:318)
        org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:62)
        org.apache.spark.scheduler.Task.run(Task.scala:54)
        org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:177)
        java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        java.lang.Thread.run(Thread.java:745)

Предел загрузки еще 5T? Если это почему я получаю эту ошибку и как ее исправить?

    
задан Daniel Mahler 12.10.2014 в 00:15
источник

2 ответа

12

Размер ограничен 5 ТБ. Размер upload по-прежнему составляет 5 ГБ, как описано в руководстве:

  

В зависимости от размера загружаемых данных Amazon S3 предлагает следующие варианты:

     
  • Загрузка объектов за одну операцию. С помощью одной операции PUT вы можете загружать объекты размером до 5 ГБ.

  •   
  • Загрузка объектов по частям. Используя API загрузки Multipart, вы можете загружать большие объекты, до 5 ТБ.

  •   

Ссылка

Как только вы выполняете многостраничную загрузку, S3 проверяет и рекомбинирует детали, а затем у вас есть единственный объект на S3 размером до 5 ТБ, который можно загрузить как единое право, с единственным HTTP GET request ... но загрузка потенциально намного быстрее, даже на файлы размером менее 5 ГБ, поскольку вы можете загружать детали параллельно и даже повторять загрузку любых частей, которые не были успешными при первой попытке.

    
ответ дан Michael - sqlbot 12.10.2014 в 05:15
3

Трюк обычно, кажется, выясняет, как сказать S3, чтобы сделать многостраничную загрузку. Для копирования данных с HDFS на S3 это можно сделать с помощью файловой системы s3n и, в частности, включения многостраничных загрузок с fs.s3n.multipart.uploads.enabled=true

Это можно сделать так:

hdfs dfs -Dfs.s3n.awsAccessKeyId=ACCESS_KEY -Dfs.s3n.awsSecretAccessKey=SUPER_SECRET_KEY -Dfs.s3n.multipart.uploads.enabled=true -cp hdfs:///path/to/source/data s3n://bucket/folder/

И дополнительную конфигурацию можно найти здесь: Ссылка     

ответ дан Sean 22.02.2016 в 21:40