隨着 MapReduce 的流行,其開源實現 Hadoop 也變得越來越受推崇。在 Hadoop 系統中,有一個組件非常重要,那就是調度器。調度器是一個可插拔的模塊,用戶可以根據自己的實際應用要求設計調度器
1、調度器基本作用
Hadoop調度器的基本作用就是根據節點資源(slot)使用情況和作業的要求,將任務調度到各個節點上執行
2、調度器考慮的因素
1、作業優先級。作業的優先級越高,它能夠獲取的資源(slot數目)也越多。Hadoop 提供了5種作業優先級,分別為 VERY_HIGH、HIGH、NORMAL、 LOW、VERY_LOW,通過mapreduce.job.priority屬性來設置。
2、作業提交時間。顧名思義,作業提交的時間越早,就越先執行。
3、作業所在隊列的資源限制。調度器可以分為多個隊列,不同的產品線放到不同的隊列里運行。不同的隊列可以設置一個邊緣限制,這樣不同的隊列有自己獨立的資源,不會出現搶占和濫用資源的情況
3、調度器原理
任務調度器的原理是怎么樣的?我們來先看一下任務調度原理圖,如下所示
在上圖中,TaskScheduler 是 JobTracker 的一個組件、一個成員,它們之間是函數與調用的關系。而 Client、JobTracker和TaskTracker之間是通過網絡RPC來交互。下面我們就來分析調度器的大致原理。
1、Client 通過submitJob()函數向JobTracker提交一個作業。
2、JobTracker通知 TaskScheduler,調用其內部函數initJob()對這個作業進行初始化,創建一些內部的數據結構。
3、TaskTracker 通過心跳來向 JobTracker 匯報它的資源情況,比如有多少個空閑的map slot和reduce slot。
4、如果 JobTracker 發現第一個 TaskTracker 有空閑的資源 ,JobTracker 就會調用 TaskScheduler 的 assignTasks() 函數,返回一些task list給第一個TaskTracker。 這時TaskTracker就會執行調度器分配的任務
4、Hadoop自帶調度器
目前,Hadoop 作業調度器主要有三種:FIFO、Capacity Scheduler和Fair Scheduler。下面我們分別介紹。
1、先進先出調度器(FIFO)
FIFO 是 Hadoop 中默認的調度器,也是一種批處理調度器。它先按照作業的優先級高低,再按照到達時間的先后選擇被執行的作業。原理圖如下所示。
比如,一個 TaskTracker 正好有一個空閑的 slot,此時 FIFO 調度器的隊列已經排好序,就選擇排在最前面的任務 job1,job1 包含很多 map task和reduce task。假如空閑資源是 map slot,我們就選擇 job1 中的 map task。假如 map task0 要處理的數據正好存儲在該 TaskTracker 節點上,根據數據的本地性,調度器把 map task0 分配給該TaskTracker。FIFO 調度器整體就是這樣一個過程。
2、 容量調度器(Capacity Scheduler)
支持多個隊列,每個隊列可配置一定的資源量,每個隊列采用FIFO調度策略,為了防止同一個用戶的作業獨占隊列中的資源,該調度器會對同一用戶提交的作業所占資源量進行限定。調度時,首先按以下策略選擇一個合適隊列:計算每個隊列中正在運行的任務數與其應該分得的計算資源之間的比值,選擇一個該比值最小的隊列;然后按以下策略選擇該隊列中一個作業:按照作業優先級和提交時間順序選擇,同時考慮用戶資源量限制和內存限制。 原理圖如下所示
比如我們分為三個隊列:queueA、queueB和queueC,每個隊列的 job 按照到達時間排序。假如這里有 100 個slot,queueA 分配 20% 的資源,可配置最多運行 15 個task,queueB 分配 50% 的資源,可配置最多運行 25 個task,queueC 分配 30% 的資源,可配置最多運行 25 個task。這三個隊列同時按照任務的先后順序依次執行,比如,job11、job21和job31分別排在隊列最前面,是最先運行,也是同時運行。
3、公平調度器(Fair Scheduler)
同計算能力調度器類似,支持多隊列多用戶,每個隊列中的資源量可以配置,同一隊列中的作業公平共享隊列中所有資源。原理圖如下所示
比如有三個隊列:queueA、queueB和queueC,每個隊列中的 job 按照優先級分配資源,優先級越高分配的資源越多,但是每個 job 都會分配到資源以確保公平。在資源有限的情況下,每個 job 理想情況下獲得的計算資源與實際獲得的計算資源存在一種差距, 這個差距就叫做缺額。在同一個隊列中,job的資源缺額越大,越先獲得資源優先執行。作業是按照缺額的高低來先后執行的,而且可以看到上圖有多個作業同時運行
如果,您認為閱讀這篇博客讓您有些收獲,不妨點擊一下右下角的【推薦】。
如果,您希望更容易地發現我的新博客,不妨點擊一下左下角的【關注我】。
如果,您對我的博客所講述的內容有興趣,請繼續關注我的后續博客,我是【劉超★ljc】。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。