所以基本上我有一个python spark作业,读取一些简单的json文件,然后尝试将它们写入由一个字段分区的orc文件。分区不是很平衡,因为有些键非常大,而其他键非常小。
当我做这样的事情时,我有内存问题:
events.write.mode('append').partitionBy("type").save("s3n://mybucket/tofolder"), format="orc")
为执行程序增加内存似乎没有任何效果,但我解决了这个问题,增加了驱动程序内存。这是否意味着所有的数据都被发送到驱动程序供其写入?每个执行器不能写自己的分区吗?我使用Spark 2.0.1
即使您对数据集进行分区,然后将其写入存储器,也不可能将记录发送给驱动程序。您应该查看内存问题的日志(如果它们发生在驱动程序或执行程序上),以找出失败的确切原因。
可能你的驱动程序内存太低,无法处理这个write
,因为之前的计算。尝试减少spark.ui.retainedJobs
和spark.ui.retainedStages
以节省旧作业和阶段元数据的内存。如果这不起作用,请使用jvisualvm
连接到驱动程序以查找消耗大量堆碎片的作业/阶段,并尝试优化。