相关疑难解决方法(0)

将5G文件上载到Amazon S3时出现EntityTooLarge错误

根据此公告,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>
Run Code Online (Sandbox Code Playgroud)

这使得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)
Run Code Online (Sandbox Code Playgroud)

上传限制是否还是5T?如果这是我收到此错误的原因,我该如何解决?

amazon-s3 jets3t apache-spark parquet apache-spark-sql

10
推荐指数
2
解决办法
9366
查看次数

在S3上以Parquet格式保存>> 25T SchemaRDD

尝试在S3上以Parquet格式保存非常大的SchemaRDD时遇到了许多问题.我已经针对这些问题发布了具体问题,但这是我真正需要做的.代码看起来应该是这样的

import org.apache.spark._
val sqlContext = sql.SQLContext(sc)
val data = sqlContext.jsonFile("s3n://...", 10e-6)
data.saveAsParquetFile("s3n://...")
Run Code Online (Sandbox Code Playgroud)

如果我有超过2000个分区或者如果分区大于5G,我会遇到问题.这就是我可以用这种方式处理的最大大小SchemaRDD的上限.由于分区大小差异很大,并且您只需要1个5G分区即可使进程失败,因此最接近1T.

处理我遇到的具体问题的问题是

这个问题是看是否有任何主要目标的解决方案,不一定涉及直接解决上述问题.


要提炼出来,有两个问题

  • 将大于5G的单个分片写入S3失败.AFAIK这是一个内置限制的s3n://桶.它应该是可能的s3://桶,但似乎不起作用Spark和hadoop distcp本地HDFS也不能这样做.

  • 一旦有1000个分片,写入摘要文件往往会失败.这似乎有很多问题.直接写入S3会在上面的链接问题中产生错误.直接写入本地HDFS时,即使在r3.8xlarge(244G ram)上有大约5000个分片,也会产生OOM错误.这似乎与实际数据量无关.摘要文件似乎对高效查询至关重要.

总之,这些问题限制了S3上的Parquet表到25T.在实践中,实际上它实际上要少得多,因为在RDD中分片大小可以变化很大,并且5G限制适用于最大分片.

如何将>> 25T RDD作为Parquet写入S3?

我使用的是Spark-1.1.0.

amazon-s3 apache-spark parquet apache-spark-sql

8
推荐指数
1
解决办法
2113
查看次数