Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 通过EMR写入s3a时发生OutOfMemory错误_Amazon Web Services_Amazon S3_Pyspark_Amazon Emr - Fatal编程技术网

Amazon web services 通过EMR写入s3a时发生OutOfMemory错误

Amazon web services 通过EMR写入s3a时发生OutOfMemory错误,amazon-web-services,amazon-s3,pyspark,amazon-emr,Amazon Web Services,Amazon S3,Pyspark,Amazon Emr,为以下PySpark代码获取OutOfMemory错误:(在写入一定数量的行后失败。如果我尝试写入hadoop文件系统而不是使用s3a,则不会发生这种情况,因此我认为我已将其缩小到s3a的问题。)-结束目标写入s3a。 我想知道是否有一个最佳的s3a配置,在这个配置中,我不会为非常大的表耗尽内存 df = spark.sql("SELECT * FROM my_big_table") df.repartition(1).write.option("header&qu

为以下PySpark代码获取OutOfMemory错误:(在写入一定数量的行后失败。如果我尝试写入hadoop文件系统而不是使用s3a,则不会发生这种情况,因此我认为我已将其缩小到s3a的问题。)-结束目标写入s3a。 我想知道是否有一个最佳的s3a配置,在这个配置中,我不会为非常大的表耗尽内存

df = spark.sql("SELECT * FROM my_big_table")
df.repartition(1).write.option("header", "true").csv("s3a://mycsvlocation/folder/")
我的s3a配置(emr默认值):

堆栈跟踪的底部:

Caused by: java.lang.OutOfMemoryError
        at java.io.ByteArrayOutputStream.hugeCapacity(ByteArrayOutputStream.java:123)
        at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:117)
        at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
        at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
        at org.apache.hadoop.fs.s3a.S3AFastOutputStream.write(S3AFastOutputStream.java:194)
        at org.apache.hadoop.fs.FSDataOutputStream$PositionCache.write(FSDataOutputStream.java:60)
        at java.io.DataOutputStream.write(DataOutputStream.java:107)
        at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
        at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:282)
        at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)
        at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207)
        at com.univocity.parsers.common.input.WriterCharAppender.writeCharsAndReset(WriterCharAppender.java:152)
        at com.univocity.parsers.common.AbstractWriter.writeRow(AbstractWriter.java:808)
        ... 16 more

这里的问题是默认的s3a上载不支持上载大于2GB或2147483647字节的单个大文件

('fs.s3a.multipart.threshold', '2147483647')
我的EMR版本比最近的版本旧,因此multipart.threshold参数仅为整数,因此单个“部分”或文件的限制为2147483647字节。较新的版本使用long而不是int,并且可以支持更大的单个文件大小限制


我将使用一种变通方法将文件写入本地HDF,然后通过一个单独的java程序将其移动到s3。

我猜可能是因为
重新分区(1)
,因为所有负载都集中在一个worker中。您是否可以在不重新分区的情况下进行尝试,并确认它是否正常工作?此外,如果您能够使用hdfs编写,您可以使用
s3distcp
hdfs
复制到
s3
。spark更适合多个文件而不是单个文件。EMR不支持
S3A
。使用
S3
。是的,你可以使用它,但是可能会出现很多问题。
('fs.s3a.multipart.threshold', '2147483647')