Hadoop排程器原理解析
一、自帶的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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Go排程器系列(3)圖解排程原理Go圖解
- [典藏版] Golang 排程器 GMP 原理與排程全分析Golang
- 學習Hadoop生態第一步:Yarn基本原理和資源排程解析!HadoopYarn
- Flink排程之排程器、排程策略、排程模式模式
- 不可不知的資源管理排程器Hadoop YarnHadoopYarn
- Kubernetes叢集排程器原理剖析及思考
- Hadoop Yarn框架原理解析HadoopYarn框架
- 深入 Java Timer 定時排程器實現原理Java
- jdk排程任務執行緒池ScheduledThreadPoolExecutor工作原理解析JDK執行緒thread
- Go排程器系列(2)巨集觀看排程器Go
- Kubernetes 排程器
- RxJava原始碼解析(二)—執行緒排程器SchedulerRxJava原始碼執行緒
- Apache Oozie 教程:使用 Oozie 排程 Hadoop 作業ApacheHadoop
- Hadoop YARN:排程效能最佳化實踐HadoopYarn
- 排程器簡介,以及Linux的排程策略Linux
- Go語言排程器之主動排程(20)Go
- Go runtime 排程器精講(五):排程策略Go
- Go runtime 排程器精講(二):排程器初始化Go
- 深入 Java Timer 定時任務排程器實現原理Java
- 不用一行程式碼,搞懂React排程器原理行程React
- Yarn的排程器Yarn
- Go語言排程器之排程main goroutine(14)GoAI
- Pod的排程是由排程器(kube-scheduler)
- 從原始碼分析 GMP 排程原理原始碼
- k8s排程器介紹(排程框架版本)K8S框架
- 也談goroutine排程器Go
- Linux I/O排程器Linux
- Go Runtime 的排程器Go
- 網路 - DNS解析過程原理DNS
- DNS的原理和解析過程DNS
- 【深入理解Go】協程設計與排程原理(上)Go
- 【深入理解Go】協程設計與排程原理(下)Go
- Kubernetes 排程器實現初探
- 改造 Kubernetes 自定義排程器
- k8s排程器K8S
- 如何選擇IO排程器
- RxJava排程器的選擇RxJava
- LeetCode 621 任務排程器LeetCode
- Golang的GMP排程模型與原始碼解析Golang模型原始碼