MapReduce作業運行機制

1、mapreduce的體系結構

2、mapreduce作業運行機制
2.1運行圖

2.2運行解析

2.2.1作業的提交
1)此方法調用submit(). 在Submit()方法裏面連接JobTracker,即生成一個內部JobSummitter(實際上是new JobClient(),在new           JobClient()裏面生成一個JobSubmissionProtocol接口(JobTracker實現了此接口)對象jobSubmitClient(是它連接或對應着JobTracker)),在Submit()方法裏面也調用JobClient.submitJobInternal(conf)方法返回一個RunningJob(步驟1)
2)參數true說明要調用方法jobClient.monitorAndPrintJob()即檢查作業的運行情況(每秒一次),如果有變化就報告給控制檯
jobClient.submitJobInternal()所實現的提交作業過程如下:
3) 向Jobtracker請求一個新的job ID(步驟2)
4) 檢查作業的輸出路徑,如果未指定或已存在則不提交作業並拋錯誤給程序;
5) 計算並生成作業的輸入分片,如果路徑不存在則不提交作業並拋錯誤給程序;
6) 將運行作業所需要的資源(包括作業jar文件,配置文件和計算所得的輸入分片)複製到jobtracker的文件系統中以job id命名的目錄下(即HDFS中)。作業jar副本較多(mapred.submit.replication = 10)(步驟3)
7) 告知jobtracker作業準備執行(真正的提交作業jobSubmitClient.submitJob())(步驟4)

2.2.3作業的初始化
1)jobtracker接收到對其submitJob()方法的調用後,將其放入內部隊列,交由job scheduler進行調度,並對其進行初始化,包括創建一個正在運行作業的對象---封裝任務和記錄信息(步驟5)
2)爲了創建任務運行列表,job scheduler首先從共享文件系統中獲取已計算好的輸入分片信息(步驟6),然後爲每個分片創建一個map任務
3)創建的reduce任務數量由Job的mapred.reduce.task屬性決定(setNumReduceTasks()設置),schedule創建相應數量的reduce任務。 任務在此時被指定ID。
4)除了map和reduce任務,還有setupJob和cleanupJob需要建立:由tasktrackers在所有map開始前和所有reduce結束後分別執行,這兩個方法在OutputCommitter中(默認是FileOutputCommitter)。setupJob()創建輸出目錄和任務的臨時工作目錄,cleanupJob()刪除臨時工作目錄。

2.2.4作業的分配
1)每個tasktracker定期發送心跳給jobtracker,告知自己還活着,並附帶消息說明自己是否已準備好接受新任務。jobtracker以此來分配任務,並使用心跳的返回值與tasktracker通信(步驟7)。Jobtracker利用調度算法先選擇一個job然後再選此job的一個task分配給tasktracker.
2)每個tasktracker會有固定數量的map和reduce任務槽,數量有tasktracker核的數量和內存大小來決定。jobtracker會先將tasktracker的所有的map槽填滿,然後才填此tasktracker的reduce任務槽。
3)Jobtracker分配map任務時會選取與輸入分片最近的tasktracker,分配reduce任務用不着考慮數據本地化。

2.2.5任務的執行
用到上面提到的setupJob()
1) tasktracker分配到一個任務後,首先從HDFS中把作業的jar文件及運行所需要的全部文件(DistributedCache設置的)複製到tasktracker本地(步驟8);
2) 接下來tasktracker爲任務新建一個本地工作目錄,並把jar文件的內容解壓到這個文件夾下;
3) tasktracker新建一個taskRunner實例來運行該任務(步驟9);
4) TaskRunner啓動一個新的JVM來運行每個任務(步驟10),以便客戶的map/reduce不會影響tasktracker。

2.2.6進度和狀態的更新
一個作業和它的每個任務都有一個狀態,包括:作業或任務的運行狀態(running, successful, failed),map和reduce的進度,計數器值,狀態消息或描述。
map進度標準是處理輸入所佔比例,reduce是copy\merge\reduce整個進度的比例。
Child JVM有獨立的線程每隔3秒檢查任務更新標誌,如果有更新就會報告給此tasktracker;
tasktracker每隔5秒給jobtracker發心跳;
job tracker合併這些更新,產生一個表明所有運行作業及其任務狀態的全局試圖。
JobClient.monitorAndPrintJob()每秒查詢這些信息。

2.2.7作業的完成
當jobtracker收到最後一個任務(this will be the special job cleanup task)的完成報告後,便把job狀態設置爲successful。
Job得到完成信息便從waitForCompletion()返回。
最後,jobtracker清空作業的工作狀態,並指示tasktracker也清空作業的工作狀態(如刪除中間輸出)。


2.3失敗解析

2.3.1 任務失敗
1)子任務失敗。當map或者reduce子任務中的代碼拋出異常,JVM進程會在退出之前向服進程tasktracker進程發送錯誤報告,tasktracker會將此(任務嘗試)task attempt標記爲failed狀態,釋放一個槽以便運行另外一個任務
2)jvm失敗。JVM突然退出,即JVM錯誤,這時tasktracker會注意到進程已經退出,標記爲failed
另外:
1)任務失敗有重試機制,重試次數map任務設置是mapred.map.max.attempts屬性控制,reduce是mapred.reduce.max.attempts屬性控制。
2)一些job可以任務完成總體的一部分就能夠接受,這個百分比由mapred.map.failures.precent和mapred.reduce.failures.precent參數控制。
3)任務嘗試(task attempt)是可以中止(killed)的。

2.3.2 tasktracker失敗
作業運行期間,tasktracker會通過心跳機制不斷與系統jobtracker通信,如果某個tasktracker運行緩慢或者失敗,出現故障。tasktracker就會停止或者很少想jobtracker發送心跳,jobtracker會注意到此tasktracker發送心跳的情況,從而將此tasktracker從等待任務調度的tasktracker池中移除,
1) 如果是map並且成功完成的話, jobtracker會安排此tasktracker上一成功運行的map任務返回
2) 如果是reduce並且成功的話,數據直接使用,因爲reduce只要執行完了的就會把輸出寫到Hdfs上
3) 如果他們屬於未完成的作業的話,reduce階段無法獲取改tasktracker上的本地map輸出文件,任何任務都需要重新調度
另外,即使tasktracker沒有失敗,如果它上面的失敗任務遠遠高於集羣的平均失敗任務數,也會被列入黑名單。可以通過重啓從jobtracker的黑名單移除。

2.3.3 jobtracker失敗
jobtracker失敗應該說是最嚴重的一種失敗方式了,而且在Hadoop中存在單點故障的情況下是相當嚴重的,因爲在這種情況下作業最終失敗,儘管這種故障的概率極小。未來版本可以通過啓動多個jobtracker,在這種情況只運行一個主的jobtracker.通過一種機制來確定那個是主的jobtracker.








發佈了65 篇原創文章 · 獲贊 61 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章