【问题标题】:EntityTooLarge error when uploading a 5G file to Amazon S3将 5G 文件上传到 Amazon S3 时出现 EntityTooLarge 错误
【发布时间】:2014-12-06 19:51:04
【问题描述】:

根据announcement,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 使用 SchemRDD.saveAsParquetFile 方法写出 Parquet 数据集。 完整的堆栈跟踪是

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$1(ParquetTableOperations.scala:305)
        org.apache.spark.sql.parquet.InsertIntoParquetTable$$anonfun$saveAsHadoopFile$1.apply(ParquetTableOperations.scala:318)
        org.apache.spark.sql.parquet.InsertIntoParquetTable$$anonfun$saveAsHadoopFile$1.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吗?如果是我收到此错误的原因,我该如何解决?

【问题讨论】:

标签: amazon-s3 apache-spark jets3t parquet apache-spark-sql


【解决方案1】:

object 大小限制为 5 TB。 upload 大小仍然是 5 GB,如手册中所述:

根据您上传的数据大小,Amazon S3 提供以下选项:

  • 在单个操作中上传对象 - 通过单个 PUT 操作,您可以上传最大为 5 GB 的对象。

  • 分段上传对象 - 使用分段上传 API,您可以上传大型对象,最大为 5 TB。

http://docs.aws.amazon.com/AmazonS3/latest/dev/UploadingObjects.html

在您进行分段上传后,S3 会验证并重新组合各个部分,然后您在 S3 中就有一个最大为 5TB 的对象,可以通过单个 HTTP GET 请求作为单个实体下载...但上传速度可能要快得多,即使文件小于 5GB,因为您可以并行上传各个部分,甚至可以重试第一次尝试未成功的任何部分的上传。

【讨论】:

    【解决方案2】:

    诀窍通常似乎是弄清楚如何告诉 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/
    

    进一步的配置可以在这里找到:https://hadoop.apache.org/docs/stable/hadoop-aws/tools/hadoop-aws/index.html

    【讨论】:

    【解决方案3】:

    如果您使用 aws cli 进行上传,您可以使用“aws s3 cp”命令,这样就不需要拆分和分段上传

    aws s3 cp masive-file.ova s3://<your-bucket>/<prefix>/masive-file.ova
    

    【讨论】:

    • 有时您只需要一个简单的命令。
    猜你喜欢
    • 1970-01-01
    • 2019-10-11
    • 2011-06-09
    • 2019-04-18
    • 2015-05-05
    • 2022-08-02
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    相关资源
    最近更新 更多