Hadoop排程器原理解析

破棉襖發表於2014-07-16


一、自帶的FIFO排程器:


Task分配流程:

1.對於目前的Hadoop任務排程設計來看,分配過程是一個“拉”的過程,即每一個TaskTracker節點主動向JobTracker節點請求作業的任務,而不是當有新作業的時候,JobTracker節點主動給TaskTracker節點分配任務。Cluster執行期,每個TT都要向JT彙報狀態資訊(預設時間間隔為3秒),這包括TT自身的狀態屬性、執行在TT上每個task的狀態、slot的設定情況等。這些狀態資訊只是源資料(raw data),提供給JT做分析決策使用,task scheduler也需要它來分配Task。 

2.先計算出scheduler依賴的FIFO job queue中有多少task還沒有執行,這些將要執行的task越多,當前Cluster的負載就越大。TT的負載與Cluster的負載是差不多相互影響的,如果Cluster的負載很大,那麼所有TT就得滿負載工作;如果Cluster將要執行的task不多的話,那麼相應地TT也可以減少些task 分配。無論怎樣,任務排程器JobQueueTaskScheduler總是按照優先順序的FIFO來排程每一個Job的Map任務,但對於每一個Job,它只給一次機會,也就是說它頂多只排程該Job的一個Map任務,然後就再排程其它Job的一個Map任務給當前的TaskTracker節點,同時優先分配一個Job的本地任務,當給當前的TaskTracker節點分配了一個非本地任務時,任務排程器JobQueueTaskScheduler就不會再給該TaskTracker節點分配Map任務了,儘管該TaskTracker節點還有空閒的Map Slot。這主要考慮到TaskTracker節點執行非本地任務的代價(CPU不是主要的,關鍵是網路頻寬)。

計算一個TaskTracker節點是否需要保留部分計算能力(Map/Reduce Slots):
 在任務排程器JobQueueTaskScheduler的實現中,如果在叢集中的TaskTracker節點比較多的情況下,它總是會想辦法讓若干個TaskTracker節點預留一些空閒的slots(計算能力),以便能夠快速的處理優先順序比較高的Job的Task或者某個任務對應的推測任務,以保證已經被排程的作業的完成。


Map分配流程圖:
轉載因子:剩餘的任務數量和叢集最大能夠執行的任務數量的比值。


Reduce分配流程圖:




簡單記錄下Capacity Scheduler和fair Scheduler:

二、Capacity Scheduler

排程演算法:
    1.選擇queue佇列    
               -按資源使用率  numSlotsOccupied(槽位佔用數) / capacity(容量:% cluster slots) 由小到大排序 。 
               -跳過已超過max-capacity的queue。(max-capacity(% cluster slots):最大容量)

    2.從queue中選擇job
                  -基於優先順序(預設關閉)的FIFO排序。 (基於優先順序和提交時間排序,如果沒有開啟優先順序則只根據提交時間排序) 
                  -選擇一個Job  選中的作業需滿足兩個條件:
                                  1).作業所屬的使用者的使用資源沒有達到上限
                                  2).該TaskTracker節點剩餘的記憶體足夠來執行該Job的Task
                                                當該TaskTracker的記憶體不能滿足作業的記憶體需求時,那麼排程器會判斷該作業是否有待執行的任務並且
                                                保留的TaskTracker是否足夠。如果是,則跳過該JobInProgress,取出佇列中的下一個JobInProgress。否則
                                                將該tasktracker中的記憶體solt保留給該Job(保留給該job的名下,這樣做是為了使該作業不至於餓死,如果
                                                TaskTracker中可用的solt數量大於等於Job中每個任務所需要的solt的數量,那麼TaskTracker會釋放掉為該
                                                 Job預留的solt,然後從Job中挑選一個任務在TaskTracker上執行)
                                                
 
    3.從job中選擇task
                -map task會考慮本地。 



三、Fair Scheduler

排程演算法:

    1.選擇Pool:
        
判斷當前執行的任務數目小於最小共享數目。(Fair演算法,只考慮記憶體使用, 後邊註釋)
                
如果二個組都小於,則比較最小共享佔比。即當前執行的數 / 該組的最小共享數。

          如果二個組都大於,則比較權重比。即執行任務數 / 權重係數。(權重越高,被選中的機率越高,且獲得資源時獲取的量也越大)

          如果二者還是相等,則根據起始時間來比較。

    2.選擇job:
           預設採用Fair演算法,可支援FIFO、Fair、DRF演算法

  

   FIFO:先按照優先順序高低排程,如果優先順序相同,則按照提交時間先後順序排程,如果提交時間相同,則按照(佇列或者應用程式)名稱大小(字串比較)排程;

   FAIR:按照記憶體資源使用量比率排程,即按照used_memory(使用的記憶體)/minShare(最少資源保證量,只考慮記憶體)大小排程(核心思想是按照該排程演算法決定排程順序,但還需考慮一些邊界情況);

   DRF:借鑑了中的設計策略,按照主資源公平排程演算法進行排程,具體已經在進行了介紹。





最後借用董專家的一張圖說明 Capacity  和 Fair 之間的區別:



設定任務執行的佇列以及優先順序

作業提交到的佇列:mapreduce.job.queuename

作業優先順序:mapreduce.job.priority

Pig版本:

SET mapreduce.job.queuename root.etl.distcp;

SET mapreduce.job.priority HIGH;

Hive版本:

SET mapreduce.job.queuename=root.etl.distcp;

SET mapreduce.job.priority=HIGH;

MapReduce版本:

hadoop jar app.jar -D mapreduce.job.queuename=root.etl.distcp -D mapreduce.job.priority=HIGH




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29754888/viewspace-1220318/,如需轉載,請註明出處,否則將追究法律責任。

相關文章