spark任務在yarn中的資源分配

2021-10-10 04:33:18 字數 2243 閱讀 6468

監控頁面: master://8088

所佔記憶體總大小: 引數如下圖:

實際情況中,應用程式申請到的資源量一定大於所申請的資源量

例如:spark driver指定記憶體 2g,executor指定記憶體 2g*3 合計應該是8192m記憶體

但實際上分配的記憶體或許為 12288m 等,為何會出現這樣的情況?

因為由jvm自身的開銷,並且還涉及到乙個名詞——規整化因子

並且yarn的不同任務排程模式下的資源分配總理的計算方式是不同的

規整化因子關於記憶體的預設配置: yarn.scheduler.increment-allocation-mb=1024m

在fifo schedule與capacity schedule下,規整化因子不會隨著改變配置而改變(1024m)

在fair schedule下,規整化因子自己調整會生效

那麼規整化因子的記憶體配置代表的是誰的記憶體呢?

由spark.yarn.executor.memoryoverhead引數控制,預設是 max(executormemory*0.10,384m)

384m代表jvm自身的開銷,最小的需求為384m

實際記憶體的計算公式,原始碼如下

var executormemory =

1024

// 預設值,1024mb

val memory_overhead_factor =

0.10

// overhead 比例引數,預設0.1

val memory_overhead_min =

384val executormemoryoverhead = sparkconf.getint(

"spark.yarn.executor.memoryoverhead"

,math.max(

(memory_overhead_factor * executormemory)

.toint, memory_overhead_min)

)// 假設有設定引數,即獲取引數,否則使用executormemoryoverhead 的預設值

val executormem = args.executormemory + executormemoryoverhead

// 最終分配的executor 記憶體為 兩部分的和

所以上面那個例子:

spark-submit --master yarn-cluster --name test --driver-memory 2g --executor-memory 2g --executor-nums 3
在yarn-cluster模式下提交,並且yarn在fair schedule排程模式下,按道理jvm所占用的記憶體為:

max(2g*0.1,384)=384m,但實際並不是這樣的, 當規整化因子的記憶體大小設定為 1024m時,jvm所占用的實際記憶體為:

ceil(a/b)*b , a為程式申請的jvm資源,b為規整化因子中記憶體的引數大小

也就是說 不足1024m,按照1024m計算,取滿足所需jvm記憶體大小時,規整化因子的最小整倍數的值。

所以:ceil(384/1024)*1024=1024m=1g

所以分配的記憶體為: 3*(2+1)+(2+1)=12g=12288m

那如果規整化因子的記憶體增量設定為512m呢?

ceil(384/512)*512=512m=0.5g

memory=> 3*(2+0.5)+(2+0.5)=10g=10240m

如果使用yarn-client方式提交呢?

不同的是,cluster模式下,記憶體大小與cpu的核數由driver-memory與driver-cpu來指定,但是client模式下,container預設只有1g記憶體,1個cpu核心

spark-submit --master yarn-client --name test --driver-memory 2g --executor-memory 2g --executor-nums 3
所分配的記憶體為: 3*(2+1)+1=10g=10240m

ory 2g --executor-memory 2g --executor-nums 3

所分配的記憶體為:    3*(2+1)+1=10g=10240m

Spark在Yarn上的效能調優

1 process local 程序本地化 推薦使用 和資料在同乙個 executor 程序中,資料在executor的blockmanager中,效能最好 2 node local 節點本地化 推薦使用 和資料在乙個節點中,主要分兩種情況 i 資料在節點上,task在節點上的executor中執行...

Spark 程式在Yarn上的記憶體問題,簡單解釋

當上傳spark程式時,總會有出現以下這個錯誤 spark submit報錯 container exited with a non zero exit code 143 還有比如 outofmemory,memory exceed 等等,乙個頭兩個大。對於只是使用spark程式的人,我實在是沒興趣...

Spark基礎(三)Spark中的任務執行

容錯機制 spark的架構特點 根據客戶端提交的jar包劃分出來乙個個的rdd,根據rdd之間的lineage關係劃分dag。劃分dag的目的是為了劃分stage。2 dag通過dagscheller劃分為stage 再劃分為taskset 根據劃分出來的dag,將dag送個dagscheduler...