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