write.save上的Spark分区将所有数据带到驱动程序?

时间:2016-11-16 22:34:28

标签: apache-spark pyspark hadoop2 orc

所以基本上我有一个python spark作业,读取一些简单的json文件,然后尝试将它们写为由一个字段分区的orc文件。分区不是很平衡,因为有些键非常大,而其他键非常小。

在做这样的事情时我遇到了记忆问题:

events.write.mode('append').partitionBy("type").save("s3n://mybucket/tofolder"), format="orc")

向执行程序添加内存似乎没有任何影响,但我解决了增加驱动程序内存的问题。这是否意味着所有数据都被发送给驱动程序以供其编写?每个执行者都不能写自己的分区吗?我正在使用Spark 2.0.1

1 个答案:

答案 0 :(得分:0)

即使您对数据集进行分区,然后将其写入存储,也不可能将记录发送到驱动程序。您应该查看内存问题的日志(如果它们出现在驱动程序或执行程序上),以找出失败的确切原因。

由于之前的计算,您的驱动程序可能内存太低而无法处理此write。尝试减少spark.ui.retainedJobsspark.ui.retainedStages以节省旧作业和阶段元数据的内存。如果这没有帮助,请使用jvisualvm连接到驱动程序以查找作业/阶段,而不是使用大堆碎片并尝试进行优化。