Spark ON Yarn的資源分配圖解
任務提交腳本
腳本模板
當我們提交一個Spark作業到YARN上,通常情況下會使用如下的腳本模板:
- spark-submit
- --class class-name
- --master yarn
- --deploy-mode cluster
- --driver-memory 4g
- --num-executors 2
- --executor-memory 2g
- --executor-cores 2
參數解讀
具體參數的含義如下圖所示:
- executor-cores
每個executor的最大核數
- num-executors=每個node的executor數 * work節點的數
每個node的executor數 = 總核數 / 每個executor的最大cup核數,具體是通過參數
yarn.nodemanager.resource.cpu-vcores進行配置,比如該值配置為:33,參數executor-cores的值為:5,那么每個node的executor數 = (33 - 1[操作系統預留])/ 5 = 6,假設集群節點為10,那么num-executors = 6 * 10 =60
- executor-memory
該參數的值依賴于:yarn-nodemanager.reaource.memory-mb,該參數限定了每個節點的container的最大內存值。
該參數的值=yarn-nodemanager.reaource.memory-mb / 每個節點的executor數量 ,如果yarn的參數配置為160,那么
yarn-nodemanager.reaource.memory-mb / 每個節點的executor數量 = 160 / 6 ≈ 26GB
Spark程序提交運行過程
- 提交作業
- 資源管理器分配資源啟動app master
- App master與Driver會同步被創建
- Spark driver與resource manager通信獲取每個節點的可用資源
- resource manager 分配資源
- spark driver啟動work節點上的executor
- executor向driver發送心跳信息
- driver發送結果到客戶端
內存管理圖解
Spark2.X的內存管理模型如下圖所示:
Spark中的內存使用大致包括兩種類型:執行和存儲。
執行內存是指用于用于shuffle、join、排序、聚合等計算的內存
存儲內存是指用于在集群中持久化和廣播內部數據的內存。
在Spark中,執行內存和存儲內存共享一個統一的區域。當沒有使用執行內存時,存儲內存可以獲取所有可用內存,反之亦然。如有必要,執行內存可以占用存儲存儲,但僅限于總存儲內存使用量低于某個閾值。
該設計確保了幾種理想的特性。首先,不使用緩存的應用程序可以使用整個空間執行,從而避免不必要的磁盤溢出。其次,使用緩存的應用程序可以保留最小存儲空間。最后,這種方法為各種工作負載提供了合理的開箱即用性能,而無需用戶內部劃分內存的專業知識。
雖然有兩種相關配置,但一般情況下不需要調整它們,因為默認值適用于大多數工作負載:
spark.memory.fraction默認大小為(JVM堆內存 - 300MB)的一小部分(默認值為0.6)。剩下的空間(40%)保留用于用戶數據結構,Spark中的內部元數據,以及在稀疏和異常大的記錄的情況下防止OOM錯誤。spark.memory.storageFraction默認大小為(JVM堆內存 - 300MB)0.60.5。