2017-08-05 49 views
1

我試圖運行Python工人(PySpark應用程序),它使用了太多的內存和我的應用程序被殺,因爲超過內存限制(我試圖降低內存的我YARN用法爲了能夠產生更多的工人)。星火+ Python的設置GC內存閾值

我來自的Java/Scala的,所以Python GC工作在我的頭上比JVM類似...

有沒有辦法來告訴Python什麼的「可用內存」的數量有?我的意思是,當您的堆大小几乎滿時,Java GC。我想對Python執行相同的操作,所以yarn不會殺死我的應用程序,因爲當內存是垃圾時(我在Python3.3上並且存在內存引用@我的機器時)使用了太多內存。

我見過資源的硬性限制和軟性限制,但沒有文檔說GC是否觸發它們。 AFAIK沒有通過內存使用觸發GC,any1是否知道這樣做的方法?

謝謝,Java相比,

回答

1

CPython的(我想這是你使用的)是顯著不同。主要垃圾收集方法是reference counting。除非您處理循環引用(恕我直言,它在正常的PySpark工作流程中並不常見),否則根本不需要完整的GC掃描(數據相關對象應在數據溢出/醃製後收集)。

星火也被殺死閒置Python的工人,就算你能重新選擇,所以經常是完全跳過GC。

可以使用set_threshold方法控制CPython的垃圾收集行爲:

gc.set_threshold(threshold0[, threshold1[, threshold2]] 

或手動觸發GC掃與collect

gc.collect(generation=2) 

,但在我的經驗中的大多數PySpark的GC問題來自JVM部分,而不是Python。

+0

謝謝(還是)。是的,我正在使用Cython。我看到了這些閾值選項,但AFAIK它們不會觸發所使用的內存量,我在一些副本(我有一些大型熊貓內存複製,沒有執行正常的PySpark工作流程)後執行了手動收集。我沒有JVM問題,因爲我將序列化程序更改爲CompressedSerializer(PickleSerializer())作爲默認設置(SparkContext構造函數中的一個)。與其他問題(mem基本上)相比,我的CPU非常強大,運行起來很輕鬆,所以Compression在這裏效果很好(我甚至比沒有它更快)。 – BiS

+0

*添加到我的prev評論,所以我想沒有選擇根據內存大小做它。我讀過默認的GC觸發每個X時間/分配(我不想等待這些,因爲GC發生YARN),所以現在我要按照你所說的手動調用它。 令我百思不解的是NO1提到CompressedSerializer爲PySpark,他們用它作爲默認的廣播,但我沒有發現任何關於它的谷歌(我發現它由潛伏到代碼)。至少對我而言,這是奇蹟。 – BiS