1、MR執行流程
作業的提交
1)啓動客戶端Client,運行Job;
2)客戶端向資源管理器(ResourceManager)提交任務,請求一個新的ID號;
3)客戶端將Job所需的資源發送給HDFS;
4)客戶端向RM提交作業;
作業的初始化
5)RM將作業請求發送給Yarn調度器(Scheduler),調度器給作業分配容器,然後在該容器中啓動Application Master;
6)NodeManager接受任務的進度和完成報告;
7)Application Master接受來自HDFS的在客戶端計算的輸入分片;
作業的分配
8)在執行過程中,若有不合適的容器,便會再次向ResourceManager申請容器;
作業的執行
9)啓動容器;
10)從HDFS中讀取Job需要的作業的配置、JAR文件、文件等資源,即資源本地化;
11)運行MR;
進度和狀態的更新
作業的完成
作業完成後,會把作業的狀態設置爲“成功”
2、Partition的作用
分區操作時shuffle中的重要的一個過程,作用就是將Map端的結果按照指定的規則分發到不同Reduce端進行處理,默認是使用hash計算分區,但是也可以自行定義分區規則。
3、Combiner的作用
在Map中可能產生大量的結果,讓Reduce直接去讀取Map產生的結果會導致網絡帶寬增高,爲此,可以再Map端進行Combiner操作,Combiner實際上就是運行在Map端的Reducer操作,這樣,可以減少帶寬的使用。
(以下紅色部分是微博易的一位很好的大哥告訴我的,非常感謝)
請記住:符合交換律和結合律的可以使用Combiner進行減少帶寬壓力,
例如:a+b+c+d,無論怎麼交換順序,結果不會改變;而
什麼時候運行Combiner?
1、當job設置了Combiner,並且spill的個數到min.num.spill.for.combine(默認是3)的時候,那麼combiner就會Merge之前執行;
2、但是有的情況下,Merge開始執行,但spill文件的個數沒有達到需求,這個時候Combiner可能會在Merge之後執行;
3、Combiner也有可能不運行,Combiner會考慮當時集羣的一個負載情況。如果集羣負載量很大,會盡量提早執行完map,空出資源,所以,就不會去執行。
---------------------
作者:李國冬
來源:CSDN
原文:https://blog.csdn.net/scgaliguodong123_/article/details/46483455
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!
4、Shuffle過程
分爲map端和reduce端
map端:
每個mapper任務都有一個環形的內存緩衝區,用於存儲map任務的輸出,默認是100MB,一旦達到閾值0.8,後臺線程就把內容溢寫(spill)到磁盤指定目錄下生成新的溢寫文件;
寫磁盤前,要進行分區(Partition),每個分區中排序(Sort),排序後合併(Combiner);在寫磁盤時,還會進行任務的輸出,此時可能導致兩種情況:要不就是磁盤寫出已完成,不會影響到後續任務的輸出;要不磁盤寫出未完成,導致mapper阻塞;
等全部記錄寫完後,合併所有的溢出文件,若被合併後的文件個數大於等於設定值(默認爲3),則再次合併,直到小於設定值。
reduce端:
Reduce主動去找自己負責的分區的數據;
複製來自多個Mapper的數據後進行merge合併操作,合併後,進行分組、排序;
在reducer中進行處理上述的數據結果,並將最終結果輸出到指定目錄
擴展:
mapper一般執行輸入格式解析、投影(選擇相關的字段)和過濾(去掉無關記錄)
給張剖析MapReduce作業運行機制的圖(摘錄自《Hadoop權威指南》)