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