![](/img/trans.png)
[英]Apache Spark Effects of Driver Memory, Executor Memory, Driver Memory Overhead and Executor Memory Overhead on success of job runs
[英]How to deal with executor memory and driver memory in Spark?
我對處理 Spark 中的執行程序內存和驅動程序內存感到困惑。
我的環境設置如下:
輸入數據信息:
為了簡單的開發,我使用spark-submit
在獨立集群模式(8 個工作線程、20 個內核、45.3 G 內存)下執行了我的 Python 代碼。 現在我想設置執行程序內存或驅動程序內存以進行性能調整。
從Spark 文檔中,執行程序內存的定義是
每個執行程序進程使用的內存量,格式與 JVM 內存字符串相同(例如 512m、2g)。
驅動內存呢?
您需要分配給驅動程序的內存取決於作業。
如果作業純粹基於轉換並在某些分布式輸出操作(如 rdd.saveAsTextFile、rdd.saveToCassandra 等)上終止,那么驅動程序的內存需求將非常低。 很少有 100 的 MB 會做。 驅動程序還負責傳遞文件和收集指標,但不參與數據處理。
如果作業需要驅動程序參與計算,例如某些 ML 算法需要實現結果並在下一次迭代中廣播它們,那么您的作業將取決於通過驅動程序的數據量。 .collect
、 .take
和takeSample
將數據傳遞給驅動程序,因此,驅動程序需要足夠的內存來分配這些數據。
例如,如果集群中有 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.