我在使用spark 2.0运行pyspark应用程序时注意到了奇怪的行为。在我的脚本涉及reduceByKey(以及随后的shuffle)操作的第一步中,我观察到shuffle写入的数量大致符合我的预期,但是发生的溢出比我预期的要多得多。我试图通过将每个执行程序分配的内存量增加到原始数量的8倍来避免这些溢出,但基本上没有看到溢出量的差异。奇怪的是,我也看到在此阶段运行时,几乎没有使用任何已分配的存储内存(如火花网页UI中的执行程序选项卡中所报告的那样)。
我之前看过这个问题,这让我相信增加执行记忆可能有助于避免泄漏:How to optimize shuffle spill in Apache Spark application 。这让我相信一些硬限制会导致溢出,而不是spark.shuffle.memoryFraction参数。是否存在这样的硬限制,可能在HDFS参数中?否则,除了增加执行程序内存之外,还可以采取哪些措施来避免溢出?
非常感谢,R
答案 0 :(得分:2)
使用spark.python.worker.memory
控制PySpark中的溢出行为:
聚合期间每个python worker进程使用的内存量,格式与JVM内存字符串相同(例如512m,2g)。如果聚合期间使用的内存超过此数量,则会将数据溢出到磁盘中。
是by default set to 512MB。此外,PySpark使用自己的减少机制External(GroupBy|Sorter|Merger)
,并且表现出与其原生对应物略有不同的行为。