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