一個Mapreduce做業是經過JobClient向master的JobTasker提交的(JobTasker一直在等待JobClient經過RPC協議提交做業),JobTasker接到JobClient的請求後把其加入做業隊列中。
DataNode節點的TaskTracker一直經過RPC(RPC--遠程過程調用協議它是一種經過網絡從遠程計算機上請求服務,而不須要了解底層網絡技術的協議)向JobTasker發送heartbeat詢問有沒有任務作,若是有則讓其派發任務過來,TaskTracker在其本地發起Task,執行任務。算法
做業調度策略有三種:apache
一、默認調度算法--FIFO隊列策略:網絡
hadoop默認調度器,它先按照做業優先級的高低,再按照到達時間的前後來選擇被執行的做業。框架
優勢:調度算法簡單,JobTracker工做負擔輕。機器學習
缺點:忽略了不一樣做業的需求差別。例如若是相似於對海量數據進行統計分析的做業長期佔據計算資源,那麼在其後提交的交互型做業有可能遲遲得不處處理,從而影響用戶體驗。oop
二、計算能力調度算法Capacity Scheduler(Yahoo 開發)學習
(1)Capacity Scheduler 中能夠定義多個做業隊列,做業提交時將直接放入到一個隊列中,每一個隊列中採用的調度策略是FIFO算法。spa
(2)每一個隊列均可以經過配置得到必定數量的task tracker資源用於處理map/reduce操做,調度算法將按照配置文件爲隊列分配相應的計算資源量。code
(3)該調度默認狀況下不支持優先級,可是能夠在配置文件中開啓此選項,若是支持優先級,調度算法就是帶有優先級的FIFO。xml
(4)不支持優先級搶佔,一旦一個工做開始執行,在執行完以前它的資源不會被高優先級做業所搶佔。
(5)對隊列中同一用戶提交的做業可以得到的資源百分比進行了限制以使同屬於一用戶的做業不能出現獨佔資源的狀況.
Capacity Scheduler內存管理
Capacity Scheduler能有效地對hadoop集羣的內存資源進行管理,以支持內存密集型應用。做業對內存資源需求高時,調度算法將把該做業的相關任務分配到內存資源充足的task tracker上。在做業選擇過程當中,Capacity Scheduler會檢查空閒的tasktracker上的內存資源是否知足做業要求。Tasktracker上的空閒資源(內存)數量值能夠經過tasktracker的內存資源總量減去當前已經使用的內存數量獲得,然後者包含在tasktracker向jobtracker發送的週期性心跳信息中。
配置Capacity Scheduler
步驟:
一、cd $HADOOP_HOME/contrib/capacity-scheduler
二、cp hadoop-capacity-scheduler-0.20.2-cdh3u2.jar $HADOOP_HOME/lib
配置$HADOOP_HOME/conf下的map-site.xml,增長
1 <property> 2 <name>map.jobtracker.taskScheduler</name> 3 <value>org.apache.hadoop.mapred.CapacityTaskScheduler</value> <!--這個就是剛纔拷過去的jar裏面的類--> 4 </property> 5 <property> 6 <name>mapred.queue.names</name> <!--定義隊列--> 7 <value>default,bean</value><!--兩個隊列一個default(默認)bean隊列--> 8 </property> 9 10 <!--修改$HADOOP_HOME/conf下cpacity-scheduler.xml增長屬性以下--> 11 <property> 12 <name>mapred.capacity-scheduler.queue.default.capacity</name> 13 <vaule>100</value> 14 </property> 15 <property> 16 <name>mapred.capacity-schelduler.queue.bean.capacity</name> 17 <value>100</value> 18 </property>
選擇隊列(執行前須要作):
set mapred.job.queue.name = bean(對列的名字)
三、公平份額調度算法Fair Scheduler(Facebook開發)
Facebook要處理生產型做業(數據統計分析,hive)、大批處理做業(數據挖掘、機器學習)、小型交互型做業(hive查詢),不一樣用戶提交的做業型在計算時間、存儲空間、數據流量和相應時間上都有不一樣需求。爲使hadoop mapreduce框架可以應對多種類型做業並行執行,使得用戶具備良好的體驗,Facebook公司提出該算法。
Fair Scheduler調度中,只有一個做業執行時,它將獨佔集羣全部資源。有其餘做業被提交時會有TaskTracker被釋放並分配給新提交的做業,以保證全部的做業都可以得到大致相同的計算資源。
做業池:
爲每個用戶創建一個做業池,用戶提交的做業將會放進一個可以公平共享資源的pool(池)中,每一個做業池設定了一個最低資源保障,當一個池中包含job時,它至少能夠得到minmum share的資源(最低保障資源份額機制)。
池中的做業得到必定份額的資源,能夠經過配置文件限制每一個池中做業數量,缺省狀況下,每一個做業池中選擇將要執行的做業的策略是FIFO策略,先按照優先級高低排序,而後再按照提交時間排序。
Deficit(赤字,不足):
Fair Scheldure爲每一個做業定義了一個deficit指標,Deficit是一個做業在理想狀況下的得到的計算資源和實際中得到的計算資源之間的差距。Fair Scheduler會每隔幾百毫秒觀察每一個做業有多少任務已經在這個時間間隔內執行,並將結果與它的資源份額比較,一更新該做業的deficit值。一旦有空閒的task tracker出現,首先分配給當前具備最高deficit值得做業。
例如:若是系統中存在着還沒有得到最低資源保障的做業池,那麼該池中的做業將會優先調度,而選擇池中的做業須要根據他們的deficit來決定。這樣作是爲了儘量知足做業池最低保障資源份額的限制。
配置:
cd $HADOOP_HOME/contrib/fairscheduler
cp *.jar $HADOOP_HOME/lib
注:通常版本里,lib下包含這個包
配置$HADOOP_HOME/conf下的map-site.xml,增長
1 <property> 2 <name>mapred.jobtracker.taskScheduler</name> <!--加載jar包中的類--> 3 <value>org.apache.hadoop.mapred.FairScheduler</value> 4 </property> 5 <property> 6 <name>mapred.fairscheduler.allocation.file</name> 7 <value>$HADOOP_HOME/conf/fair-scheduler.xml</value> 8 </property> 9 <property> 10 <name>mapred.queue.names</name><!--定義隊列--> 11 <value>default,bean</value><!--兩個池一個default(默認)bean池--> 12 </property> 13 <!--加上這麼一個--> 14 <property> 15 <name>mapred.fairscheduler.preemption</name> 16 <value>true</value> 17 </property>
fair-schelduler.xml根據文件裏面給的例子配置就能夠了。
選擇隊列(執行前須要作):set mapred.job.queue.name = bean(池的名字)
注:配置可能會出錯,多是不能用$HADOOP_HOME把它改問絕對路徑。