簡體   English   中英

Spark中如何處理executor內存和driver內存?

[英]How to deal with executor memory and driver memory in Spark?

我對處理 Spark 中的執行程序內存和驅動程序內存感到困惑。

我的環境設置如下:

  • 內存 128 G, 16 CPU 9 VM
  • Centos
  • Hadoop 2.5.0-cdh5.2.0
  • 火花 1.1.0

輸入數據信息:

  • 來自 HDFS 的 3.5 GB 數據文件

為了簡單的開發,我使用spark-submit在獨立集群模式(8 個工作線程、20 個內核、45.3 G 內存)下執行了我的 Python 代碼。 現在我想設置執行程序內存或驅動程序內存以進行性能調整。

Spark 文檔中,執行程序內存的定義是

每個執行程序進程使用的內存量,格式與 JVM 內存字符串相同(例如 512m、2g)。

驅動內存呢?

您需要分配給驅動程序的內存取決於作業。

如果作業純粹基於轉換並在某些分布式輸出操作(如 rdd.saveAsTextFile、rdd.saveToCassandra 等)上終止,那么驅動程序的內存需求將非常低。 很少有 100 的 MB 會做。 驅動程序還負責傳遞文件和收集指標,但不參與數據處理。

如果作業需要驅動程序參與計算,例如某些 ML 算法需要實現結果並在下一次迭代中廣播它們,那么您的作業將取決於通過驅動程序的數據量。 .collect.taketakeSample將數據傳遞給驅動程序,因此,驅動程序需要足夠的內存來分配這些數據。

例如,如果集群中有 3GB 的rdd並調用val myresultArray = rdd.collect ,那么驅動程序中將需要 3GB 的內存來保存該數據,並為第一段中提到的函數提供一些額外的空間。

在 Spark 應用程序中,Driver 負責任務調度,Executor 負責執行作業中的具體任務。

如果你熟悉 MapReduce,你的 map 任務和 reduce 任務都是在 Executor 中執行的(在 Spark 中,它們被稱為 ShuffleMapTasks 和 ResultTasks),而且,無論你想要緩存的 RDD 也在 executor 的 JVM 的堆和磁盤中。

所以我認為幾 GB 對您的驅動程序來說就可以了。

Spark shell 所需內存 =(驅動程序內存 + 384 MB)+(執行程序數量 *(執行程序內存 + 384 MB))

這里 384 MB 是 Spark 在執行作業時可能使用的最大內存(開銷)值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM