2016-12-27 67 views
3

我注意到运行带有spark 2.0的pyspark应用程序时出现的奇怪行为。在涉及reduceByKey(因此也是shuffle)操作的脚本的第一步中,我观察到shuffle写入的数量大致符合我的预期,但溢出的数量比我预期的要多得多。我试图通过将每个执行程序分配的内存量增加至原始数量的8倍来避免这些溢出,但基本上没有溢出量的差异。奇怪的是,我也看到,虽然这个阶段正在运行,但几乎没有使用任何分配的存储内存(正如火花Web UI中的执行者标签所报告的那样)。火花溢出独立执行程序内存分配

我看到了这个先前的问题,这让我相信增加执行程序的内存可能有助于避免泄漏:How to optimize shuffle spill in Apache Spark application 。这使我相信一些硬限制导致了溢出,而不是spark.shuffle.memoryFraction参数。是否存在这样的硬限制,可能是HDFS参数之间的限制?否则,除了增加执行程序内存外,还可以做些什么来避免溢出?

非常感谢,R

Tasks view inside reduce job showing spills Executors tab showing low memory use job DAG

回答

2

在PySpark溢出行为是使用spark.python.worker.memory来控制:

的内存量聚集期间每蟒工作进程使用,在与JVM内存字符串相同的格式(例如512m,2g)。如果聚合过程中使用的内存高于此数量,则会将数据泄漏到磁盘中。

这是by default set to 512MB。此外,PySpark使用自己的减少机制External(GroupBy|Sorter|Merger),并表现出与其本地对手略有不同的行为。