一個Mapreduce作業是通過JobClient向master的JobTasker提交的(JobTasker一直在等待JobClient通過RPC協議提交作業),JobTasker接到JobClient的請求后把其加入作業隊列中。
DataNode節點的TaskTracker一直通過RPC(RPC--遠程過程調用協議它是一種通過網絡從遠程計算機上請求服務,而不需要了解底層網絡技術的協議)向JobTasker發送heartbeat詢問有沒有任務做,如果有則讓其派發任務過來,TaskTracker在其本地發起Task,執行任務。
作業調度策略有三種:
1、默認調度算法--FIFO隊列策略:
hadoop默認調度器,它先按照作業優先級的高低,再按照到達時間的先后來選擇被執行的作業。
優點:調度算法簡單,JobTracker工作負擔輕。
缺點:忽略了不同作業的需求差異。例如如果類似於對海量數據進行統計分析的作業長期占據計算資源,那么在其后提交的交互型作業有可能遲遲得不到處理,從而影響用戶體驗。
2、計算能力調度算法Capacity Scheduler(Yahoo 開發)
(1)Capacity Scheduler 中可以定義多個作業隊列,作業提交時將直接放入到一個隊列中,每個隊列中采用的調度策略是FIFO算法。
(2)每個隊列都可以通過配置獲得一定數量的task tracker資源用於處理map/reduce操作,調度算法將按照配置文件為隊列分配相應的計算資源量。
(3)該調度默認情況下不支持優先級,但是可以在配置文件中開啟此選項,如果支持優先級,調度算法就是帶有優先級的FIFO。
(4)不支持優先級搶占,一旦一個工作開始執行,在執行完之前它的資源不會被高優先級作業所搶占。
(5)對隊列中同一用戶提交的作業能夠獲得的資源百分比進行了限制以使同屬於一用戶的作業不能出現獨占資源的情況.
Capacity Scheduler內存管理
Capacity Scheduler能有效地對hadoop集群的內存資源進行管理,以支持內存密集型應用。作業對內存資源需求高時,調度算法將把該作業的相關任務分配到內存資源充足的task tracker上。在作業選擇過程中,Capacity Scheduler會檢查空閑的tasktracker上的內存資源是否滿足作業要求。Tasktracker上的空閑資源(內存)數量值可以通過tasktracker的內存資源總量減去當前已經使用的內存數量得到,而后者包含在tasktracker向jobtracker發送的周期性心跳信息中。
配置Capacity Scheduler
步驟:
1、cd $HADOOP_HOME/contrib/capacity-scheduler
2、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(對列的名字)
3、公平份額調度算法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把它改問絕對路徑。