大資料基礎課之Hadoop MapReduce執行過程詳解
述一下mapreduce的流程(shuffle的sort,partitions,group)
首先是 Mapreduce經過SplitInput 輸入分片 決定map的個數在用Record記錄 key value。然後分為以下三個流程:
Map:
輸入 key(long型別偏移量) value(Text一行字串)
輸出 key value
Shuffle:、
合併(merge)map輸出時先輸出到環形記憶體,當記憶體使用率達到60%時開始溢位寫入到檔案,溢位檔案都是小檔案,所以就要合併他們,在這個構成中就會排序,根據key值比較排序
排序(sort)如果你自定義了key的資料型別要求你的類一定是WriteableCompartor的子類,不想繼承WriteableCompartor,至少實現Writeable,這時你就必須在job上設定排序比較器job.setSortCmpartorClass(MyCompartor.class);而MyCompartor.class必須繼承RawCompartor的類或子類
分割槽(partition)會根據map輸出的結果分成幾個檔案為reduce準備,有幾個reducetask就分成幾個檔案,在job上設定分割槽器job.setPartitionerClass(MyPartition.class)Myrtition.class要繼承Partitioner這個類
分組(group)分割槽時會呼叫分組器,把同一分割槽中的相同key的資料對應的value製作成一個iterable,並且會在sort。在job上設定分組器。Job.setGroupCompartorClass(MyGroup.class)MyGroup.class必須繼承RawCompartor的類跟子類
上面的結果儲存到本地檔案中,而不是hdfs上
上面只要有完成結果,reduce就開始複製上面的結果,通過http方式
Reduce
輸入key時map輸出時的key value是分組器分的iterable
輸出 key value
輸出結果儲存在hdfs上而不是本地檔案中
MapReduce的執行步驟:
1、Map任務處理
1.1 讀取HDFS中的檔案。每一行解析成一個<k,v>。每一個鍵值對呼叫一次map函式。 <0,hello you> <10,hello me>
1.2 覆蓋map(),接收1.1產生的<k,v>,進行處理,轉換為新的<k,v>輸出。 <hello,1> <you,1> <hello,1> <me,1>
1.3 對1.2輸出的<k,v>進行分割槽。預設分為一個區。詳見《Partitioner》
1.4 對不同分割槽中的資料進行排序(按照k)、分組。分組指的是相同key的value放到一個集合中。 排序後:<hello,1> <hello,1> <me,1> <you,1> 分組後:<hello,{1,1}><me,{1}><you,{1}>
1.5 (可選)對分組後的資料進行歸約。詳見《Combiner》
2、Reduce任務處理
2.1 多個map任務的輸出,按照不同的分割槽,通過網路copy到不同的reduce節點上。(shuffle)詳見《shuffle過程分析》
2.2 對多個map的輸出進行合併、排序。覆蓋reduce函式,接收的是分組後的資料,實現自己的業務邏輯, <hello,2> <me,1> <you,1>
處理後,產生新的<k,v>輸出。
2.3 對reduce輸出的<k,v>寫到HDFS中。