2017-04-08 84 views
2

問題
如何根據CPU和內存使用情況監控pyspark python工作進程。

詳細信息
根據this doc,一個SPARK工作者可以包含一個或多個python進程。

我們假設我們已經爲每個執行器分配了40g內存,這個執行器在一個擁有最多200g內存的工作器上運行。然後根據這個文檔設置:「spark.python.worker.memory」,我們可以設置每個python進程的可用內存量。

從spark.python.worker.memory設置描述引用:SPARK:Pyspark:如何監控python工作進程

的存儲器聚集期間每蟒工作進程使用,在相同的格式JVM存儲器串(例如512M,2克)的量。如果聚合過程中使用的內存高於此數量,則會將數據泄漏到磁盤中。

假設我們將spark.python.worker.memory設置爲2g。

對我來說,出現下列問題:

  • 我們怎麼知道有多少進程pyspark /火花在每個工人/執行人產卵?
  • 我們如何監控每個流程消耗的內存量以及整體情況,看看我們設置的「執行程序40g」限制有多接近?
  • 我們如何監控每個進程溢出的磁盤數量?
  • 更一般地說,我們如何使用spark.python.worker.memory設置來優化或pyspark應用程序。這只是一個試驗/錯誤的問題。如果是這樣,怎麼可以基準/監控(類似於以上)



爲什麼..好,我們打的是非常具體到我們的應用程序的一些性能問題。我們正在觀察一些我們無法再現的不一致的錯誤。因此,我們必須監視/理解每次運行應用程序時發生的事情的更精細的細節。

回答

0

根據此文檔設置:「spark.python.worker.memory」,我們可以設置每個python進程的可用內存量。

這是不正確的。正如您在鏈接的文檔中所解釋的那樣,此設置用於控制聚合行爲,而不是一般的Python工作內存。

此內存帳戶爲本地對象或廣播變量的大小,僅用於聚合的臨時結構。

我們如何知道pyspark/spark在每個worker/executor上產生了多少個進程?

Python工作者可以產生達到由可用內核數量設置的限制。由於工作人員在運行期間可能會被啓動或死亡,因此峯值負載以外的實際工人數量可能會更小。

我們應該如何監控每個進程消耗的內存量以及總體來看看我們設置的「執行程序40g」限制有多接近?

沒有Spark的具體答案。您可以使用應用程序本身的通用監視工具或resource模塊。

我們應該如何監控每個進程溢出的磁盤數量?

您可以使用Spark REST API來獲得一些見解,但通常PySpark度量標準是有限的。