2016-12-27 91 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),並表現出與其本地對手略有不同的行爲。