2014-10-11 6 views
8

Amazon S3 Dateigrößenbeschränkung ist das Hochladen soll 5T sein nach diesem announcement, aber ich erhalte die folgende Fehlermeldung, wenn eine Datei 5G HochladenEntityTooLarge Fehler, wenn eine 5G-Datei auf Amazon S3

'/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> 

Dies macht es scheint, dass S3 nur 5G-Uploads akzeptiert. Ich verwende Apache Spark SQL, um einen Parquet-Datensatz mit der Methode SchemRDD.saveAsParquetFile zu schreiben. Der vollständige Stack-Trace ist

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) 

Ist das Upload-Limit noch 5T? Wenn das der Grund ist, warum bekomme ich diesen Fehler und wie repariere ich ihn?

Antwort

12

Das Objekt Größe ist auf 5 TB begrenzt. Die Upload Größe ist immer noch 5 GB, wie im Handbuch erklärt: Objekte

  • hochladen in:

    auf die Größe der Daten, die Sie hochladen, Amazon S3 bietet folgende Optionen Je eine einzelne Operation - Mit einer einzigen Operation PUT können Sie Objekte mit einer Größe von bis zu 5 GB hochladen.

  • Objekte in Teile hochladen - Mit der Multipart-Upload-API können Sie große Objekte bis zu 5 TB hochladen.

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

Sobald Sie ein mehrteiliger Upload tun, S3 validiert und rekombiniert die Teile, und Sie dann ein einzelnes Objekt in S3 haben, bis in der Größe zu 5 TB, die als eine heruntergeladen werden kann Single Entity, mit einer einzigen HTTP GET Anfrage ... aber das Hochladen ist potenziell viel schneller, auch auf Dateien kleiner als 5 GB, da Sie die Teile parallel hochladen und sogar die Uploads von Teilen, die beim ersten Versuch nicht erfolgreich waren, wiederholen können .

3

Der Trick scheint in der Regel herauszufinden, wie man S3 anweist, einen mehrteiligen Upload durchzuführen.

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/ 

Und weitere Konfiguration finden Sie hier: Für Daten von HDFS S3 kopieren, kann dies mit Hilfe des S3N Dateisystem durchgeführt werden und ermöglicht speziell mehrt Uploads mit fs.s3n.multipart.uploads.enabled=true

Dies kann wie geschehen https://hadoop.apache.org/docs/stable/hadoop-aws/tools/hadoop-aws/index.html