Hadoop中任务提交运行流程
?
在Hadoop中提交一個任務(wù)大致分為6個步驟,分別為:
作業(yè)提交 -> 作業(yè)初始化 –> 任務(wù)分配 –> 任務(wù)執(zhí)行 –> 更新任務(wù)執(zhí)行進(jìn)度和狀態(tài) -> 作業(yè)完成
目錄
作業(yè)提交
作業(yè)初始化
任務(wù)的分配
任務(wù)執(zhí)行
更新任務(wù)執(zhí)行進(jìn)度和狀態(tài)
作業(yè)完成
客戶端(Client):編寫MapReduce程序,配置作業(yè),提交作業(yè)
JobTracker:協(xié)調(diào)作業(yè)的運(yùn)行,分配作業(yè),初始化作業(yè),與TaskTracker進(jìn)行通信
TaskTracker:負(fù)責(zé)運(yùn)行作業(yè),保持與JobTracker的通信,
HDFS:保持作業(yè)的數(shù)據(jù)與結(jié)構(gòu)
作業(yè)提交
JobClient使用runJob方法新建一個JobClient 實(shí)例,然后調(diào)用submitJob()方法進(jìn)行作業(yè)的提交,提交作業(yè)的具體過程如下:
作業(yè)初始化
當(dāng) JobTracker 收到 Job 提交的請求后,將 job 保存在一個內(nèi)部隊列,并讓 Job Scheduler(作業(yè)調(diào)度器)處理并初始化。
初始化涉及到創(chuàng)建一個封裝了其 tasks 的 job 對象,并保持對 task 的狀態(tài)和進(jìn)度的根據(jù)(step 5)。當(dāng)創(chuàng)建要運(yùn)行的一系列 task 對象后,Job Scheduler 首先開始從文件系統(tǒng)中獲取由 JobClient 計算的 input splits(step 6),然后再為每個 split 創(chuàng)建 map task。
任務(wù)的分配
TaskTracker 和 JobTracker 之間的通信和任務(wù)的分配是通過心跳機(jī)制完成的。TaskTracker 作為一個單獨(dú)的 JVM,它執(zhí)行一個簡單的循環(huán),主要實(shí)現(xiàn)每隔一段時間向 JobTracker 發(fā)送心跳,告訴 JobTracker 此 TaskTracker 是否存活,是否準(zhǔn)備執(zhí)行新的任務(wù)。如果有待分配的任務(wù),他就會為 TaskTracker 分配一個任務(wù)。
初始化完畢后,作業(yè)調(diào)度器會獲取輸入分片信息(input split),每個分片創(chuàng)建一個map任務(wù)。
接下來就是任務(wù)分配了,這個時候tasktracker會運(yùn)行一個簡單的循環(huán)機(jī)制定期發(fā)送心跳給jobtracker,心跳間隔是5秒,程序員可以配置這個時間,心跳就是jobtracker和tasktracker溝通的橋梁,通過心跳,jobtracker可以監(jiān)控tasktracker是否存活,也可以獲取tasktracker處理的狀態(tài)和問題,同時tasktracker也可以通過心跳里的返回值獲取jobtracker給它的操作指令。
任務(wù)分配好后就是執(zhí)行任務(wù)了。在任務(wù)執(zhí)行時候jobtracker可以通過心跳機(jī)制監(jiān)控tasktracker的狀態(tài)和進(jìn)度,同時也能計算出整個job的狀態(tài)和進(jìn)度,而tasktracker也可以本地監(jiān)控自己的狀態(tài)和進(jìn)度。當(dāng)jobtracker獲得了最后一個完成指定任務(wù)的tasktracker操作成功的通知時候,jobtracker會把整個job狀態(tài)置為成功,然后當(dāng)客戶端查詢job運(yùn)行狀態(tài)時候(注意:這個是異步操作),客戶端會查到j(luò)ob完成的通知的。如果job中途失敗,mapreduce也會有相應(yīng)機(jī)制處理,一般而言如果不是程序員程序本身有bug,mapreduce錯誤處理機(jī)制都能保證提交的job能正常完成。
JobTracker接收到作業(yè)后,將其放在一個作業(yè)隊列里,等待作業(yè)調(diào)度器對其進(jìn)行調(diào)度(這里是不是很像微機(jī)中的進(jìn)程調(diào)度呢),當(dāng)作業(yè)調(diào)度器根據(jù)自己的調(diào)度算法調(diào)度到該作業(yè)時,會根據(jù)輸入劃分信息為每個劃分創(chuàng)建一個map任務(wù),并將map任務(wù)分配給TaskTracker執(zhí)行。
對于map和reduce任務(wù),TaskTracker根據(jù)主機(jī)核的數(shù)量和內(nèi)存的大小有固定數(shù)量的map槽和reduce槽。這里需要強(qiáng)調(diào)的是:map任務(wù)不是隨隨便便地分配給某個TaskTracker的,這里有個概念叫:數(shù)據(jù)本地化(Data-Local)。意思是:將map任務(wù)分配給含有該map處理的數(shù)據(jù)塊的TaskTracker上,同時將程序JAR包復(fù)制到該TaskTracker上來運(yùn)行,這叫“運(yùn)算移動,數(shù)據(jù)不移動”。而分配reduce任務(wù)時并不考慮數(shù)據(jù)本地化。
任務(wù)執(zhí)行
TaskTracker 申請到新的任務(wù)之后,就要在本地運(yùn)行了。首先,是將任務(wù)本地化(包括運(yùn)行任務(wù)所需的數(shù)據(jù)、配置信息、代碼等),即從 HDFS 復(fù)制到本地。調(diào)用localizeJob()完成的。對于使用 Streaming和 Pipes 創(chuàng)建 Map 或者 Reduce 程序的任務(wù),Java 會把 key/value 傳遞給外部進(jìn)程,然后通過用戶自定義的 Map 或者Reduce 進(jìn)行處理,然后把 key/value 傳回到 Java 中。其實(shí)就好像是 TaskTracker 的子進(jìn)程在處理 Map 和 Reduce 代碼一樣。
更新任務(wù)執(zhí)行進(jìn)度和狀態(tài)
進(jìn)度和狀態(tài)是通過 heartbeat(心跳機(jī)制)來更新和維護(hù)的。來對于 Map Task,進(jìn)度就是已處理數(shù)據(jù)占所有需要數(shù)據(jù)的百分比。對于 Reduce Task,情況就有點(diǎn)復(fù)雜,包括3 部分,拷貝中間結(jié)果文件(負(fù)責(zé)階段)、排序階段、Reduce 調(diào)用,每部分占 1/3。
TaskTracker每隔一段時間會給JobTracker發(fā)送一個心跳,告訴JobTracker它依然在運(yùn)行,同時心跳中還攜帶著很多的信息,比如當(dāng)前map任務(wù)完成的進(jìn)度等信息。當(dāng)JobTracker收到作業(yè)的最后一個任務(wù)完成信息時,便把該作業(yè)設(shè)置成“成功”。當(dāng)JobClient查詢狀態(tài)時,它將得知任務(wù)已完成,便顯示一條消息給用戶。
作業(yè)完成
當(dāng) Job 完成后,JobTracker 會收一個 Job Complete 的通知,并將當(dāng)前的 Job 狀態(tài)更新為 Successful,同時 JobClient也會輪循獲知提交的 Job已經(jīng)完成,將信息顯示給用戶。最后,JobTracker 會清理和回收該 Job 的相關(guān)資源,并通知 TaskTracker 進(jìn)行相同的操作(比如刪除中間結(jié)果文件)。
?
?
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Hadoop中任务提交运行流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 集成学习-Boosting集成学习算法A
- 下一篇: 集成学习-Boosting集成学习算法G