1. 程式人生 > >Spark調研筆記第3篇 - Spark集群相應用的調度策略簡單介紹

Spark調研筆記第3篇 - Spark集群相應用的調度策略簡單介紹

executor enabled max 靜態 air apache div pan 相關

Spark集群的調度分應用間調度和應用內調度兩種情況,下文分別進行說明。

1. 應用間調度

1) 調度策略1: 資源靜態分區
資源靜態分區是指整個集群的資源被預先劃分為多個partitions,資源分配時的最小粒度是一個靜態的partition

依據應用對資源的申請需求為其分配靜態的partition(s)是Spark支持的最簡單的調度策略。
我們已經知道,不同的應用有各自的Spark Context且占用各自的JVM和executor(s)。依據Spark Job Scheduling文檔的說明,若Spark集群配置了static partitioning的調度策略,則它對提交的多個應用間默認採用FIFO順序進行調度

,每一個獲得執行機會的應用在執行期間可占用整個集群的資源,這樣做明顯不友好,所以應用提交者通常須要通過設置spark.cores.max來控制其占用的core/memory資源。

2) 調度策略2: 動態共享CPU cores
若Spark集群採用Mesos模式,則除上面介紹的static partitioning的調度策略外,它還支持dynamic sharing of CPU cores的策略。
在這樣的調度策略下。每一個應用仍擁有各自獨立的cores/memory。但當應用申請資源後並未使用時(即分配給應用的資源當前閑置),其他應用的計算任務可能會被調度器分配到這些閑置資源上。

當提交給集群的應用有非常多是非活躍應用時(即它們並不是時刻占用集群資源),這樣的調度策略能非常大程度上提升集群資源利用效率。
但它帶來的風險是:

若某個應用從非活躍狀態轉變為活躍狀態時。且它提交時申請的資源當前恰好被調度給其他應用,則它無法馬上獲得運行的機會。

3) 調度策略3: 動態資源申請
Spark 1.2引入了一種被稱為Dynamic Resource Allocation的調度策略,它同意依據應用的workload動態調整其所需的集群資源。也即,若應用臨時不須要它之前申請的資源,則它能夠先歸還給集群,當它須要時。能夠又一次向集群申請。當Spark集群被多個應用共享時,這樣的按需分配的策略顯然是很有優勢的。


在當前Spark版本號下。動態資源申請是以core為粒度的。
須要特別註意的是,動態資源申請的調度策略默認是不啟用的。且眼下僅僅支持在YARN模式(通過設置spark.dynamicAllocation.enabled能夠啟用該策略),依據Spark文檔的說明。將來的版本號會支持standalone模式和Mesos模式。

2. 應用內調度
在應用內部(每一個Application在Spark集群看來均是一個獨立的Spark Context),每一個action(spark支持的rdd action列表見這裏)以及計算這個action結果所須要的一系列tasks被統稱為一個"job"。
默認情況下,Spark調度器對同一個Application內的不同jobs採用FIFO的調度策略。每一個job被分解為不同的stages(spark支持的每一個rdd transformation即為一個stage,完整的transformations列表見這裏),當多個job各自的stage所在的線程同一時候申請資源時,第1個job的stage優先獲得資源。

假設job queue頭部的job恰好是須要最長運行時間的job時,後面全部的job均得不到運行的機會,這樣會導致某些job(s)餓死的情況。
從Spark 0.8開始。Spark集群對同一Application內的jobs的調度策略能夠被配置為"fair sharing",詳細而言,Spark對不同jobs的stages提交的tasks採用Round Robin的調度方式。如此,全部的jobs均得到公平運行的機會。

因此,即使某些short-time jobs本身的提交時間在long jobs之後,它也能獲得被運行的機會,從而達到可預期的響應時間。


要啟用fair sharing調度策略,須要在spark配置文件裏將spark.scheduler.mode設置為FAIR。
此外。fair sharing調度也支持把不同的jobs聚合到一個pool。不同的pools賦予不同的運行優先級。這是FIFO和fair sharing兩種策略的折衷策略,既能保證jobs之間的優先級,也能保證同一優先級的jobs均能得到公平運行的機會。
詳細的設置細節請參考Spark相關的配置文檔,這裏不贅述。

【參考資料】

1. Job Scheduling
2. Spark Programming Guide - Actions
3. Spark Programming Guide - Transformations

============================== EOF =========================


Spark調研筆記第3篇 - Spark集群相應用的調度策略簡單介紹