Spark調研筆記第3篇 - Spark集群相應用的調度策略簡單介紹
Spark集群的調度分應用間調度和應用內調度兩種情況,下文分別進行說明。
1. 應用間調度
1) 調度策略1: 資源靜態分區
資源靜態分區是指整個集群的資源被預先劃分為多個partitions,資源分配時的最小粒度是一個靜態的partition。
依據應用對資源的申請需求為其分配靜態的partition(s)是Spark支持的最簡單的調度策略。
我們已經知道,不同的應用有各自的Spark Context且占用各自的JVM和executor(s)。依據Spark Job Scheduling文檔的說明,若Spark集群配置了static partitioning的調度策略,則它對提交的多個應用間默認採用FIFO順序進行調度
若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模式。
在應用內部(每一個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 Scheduling2. Spark Programming Guide - Actions
3. Spark Programming Guide - Transformations
============================== EOF =========================
Spark調研筆記第3篇 - Spark集群相應用的調度策略簡單介紹