2014-10-11 14 views
8

Amazon S3 limit rozmiaru pliku ma być 5T według tego announcement, ale otrzymuję następujący błąd podczas przesyłania pliku 5Gbłąd EntityTooLarge podczas przesyłania pliku 5G do 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> 

To sprawia, że wydaje się, że S3 akceptuje tylko przesyłanie 5G. Używam Apache Spark SQL do wypisania zestawu danych Parquet przy użyciu metody SchemRDD.saveAsParquetFile. Pełne ślad stosu jest

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) 

Czy limit wysyłania nadal 5T? Jeśli właśnie dlatego otrzymuję ten błąd i jak mogę to naprawić?

Odpowiedz

12

Rozmiar obiektu jest ograniczony do 5 TB. przesyłanie rozmiar jest jeszcze 5 GB, jak wyjaśniono w instrukcji:

zależności od wielkości danych, które wysyłasz, Amazon S3 oferuje następujące opcje:

  • Dodaj obiektów w pojedyncza operacja - za pomocą pojedynczej operacji PUT można przesyłać obiekty o rozmiarze do 5 GB.

  • Przesyłanie obiektów w częściach - za pomocą interfejsu API do przesyłania danych Multipart można przesyłać duże obiekty, do 5 TB.

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

Po zrobić wieloczęściowy upload, S3 sprawdza i rekombinacji części, a następnie mieć pojedynczy obiekt w S3, aż do 5 TB w rozmiarze, który można pobrać jako jedno uprawnienie, z pojedynczym żądaniem HTTP GET ... ale przesyłanie jest potencjalnie znacznie szybsze, nawet w przypadku plików mniejszych niż 5 GB, ponieważ można przesyłać części równolegle, a nawet ponawiać próby przesłania części, które nie powiodły się przy pierwszej próbie .

3

Podstępem wydaje się być zorientowanie się, w jaki sposób poinformować S3 o konieczności przesłania pliku wieloczęściowego. Do kopiowania danych z HDFS do S3, można to zrobić za pomocą plików S3N aw szczególności umożliwienie wieloczęściowych przesłane z fs.s3n.multipart.uploads.enabled=true

Można to zrobić tak:

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/ 

I dalej konfiguracji można znaleźć tutaj: https://hadoop.apache.org/docs/stable/hadoop-aws/tools/hadoop-aws/index.html

Powiązane problemy