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