Shuffle的過程作用詳解

在這裏插入圖片描述
shuffle
shuffle過程中的幾個名詞:shuffle:洗牌;spill:溢出;combiner:合成;merge:融入混合;copy:複製
shuffle的使用地點:發生在map task輸出結果傳送到reduce task 輸入的階段
使用shuffle的好處:在從map task端拉取數據到reduce task端時,減少寬帶的消耗,
將數據完整的從map task端拉取數據到reduce task端
減少磁盤IO對task的影響
shuffle過程理解:
1.在map task端,輸入的數據來源於hdfs,切分成片來讀取,默認一個block對於一個split。
在map端執行詳細過程:
2.在執行完mapper後,mapper的輸出時k/v對。需要給reduce task處理,不同的k/v給哪個reduce處理呢(假設不只有一個reduce)
在這裏執行partioner(默認是對key hash,在以ruduce 任務的數量取模。可以看源碼)也可以自定義分區。
假如對一個key經過partitioner計算後得到0,那麼就確定了分區是part-r-00000;
確定分區之後將該對值寫入map的緩存區
1.就這樣在map task端將輸出的數據寫入緩衝區直到到達閾值(默認緩衝區大小100M,閾值是80%).
達到閾值啓動溢寫線程(spill)將前面80M的數據寫入到磁盤一個文件,這個單獨的溢寫線程不會影響map task,因爲還有20M空間供map task輸出結果
啓動溢寫線程後,對即將寫到磁盤上的80M數據的key做排序(sort)。
2.前面處理了一個k/v進入到哪個reduce task,在講很多k/v寫入磁盤時,每一個都知道自己應該被哪個reduce執行,則在磁盤文件時去同一個reduce端的在一起拼團這個過程叫combiner。
combiner是個優化過程,這樣可以減少map和reduce任務之間傳輸的中間數據,減少partition的索引記錄。(例如我之前的單詞計數例子中map輸出的是<hello,1><hello,1>到reduce輸入端時<hello,2>)
combiner的使用可以提高效率但是使用不當反而會影響效率。
在這裏思考下:Combiner本身已經執行了reduce操作,爲什麼在Reducer階段還要執行reduce操作?
combiner操作發生在map端,處理一個任務所接收的文件中的數據,不能跨map任務執行;只有reduce可以接收多個map任務處理的數據(reduce會拉取不同map 端輸出的數據放入一個緩衝區)。
3.如果數據很大,會發生多次溢寫既會有多個溢寫文件。當map task完成,所有的輸出數據都在一些磁盤溢寫文件中,然後將多個溢寫文件合併到一個文件中這個過程就是merge。
在merge時進行group,把不同map中的相同key合爲一個做例如<hello,{1,1}>。如果設置了combiner也會合並切求和或者求平均值(自己定義)
注意,如果沒有發生spill也沒指定combiner產生的文件裏存放的是map的輸出例如<hello,1><hello,1>可以通過設置reduce task數量爲0 查看part-m-00000文件看
3.到此map端工作結束,生成的這個文件存放在taskTracker能拿到的某個本地目錄內,每個reduce task不斷地通過RCP從JobTacker那後去map task是否完成。如果reduce task 得到通知獲知
某臺TaskTrack上的map task執行完成,shuffle開始執行將map的輸出拉入reduce過程。
4.rudecer真正執行之前就是不斷的拉取當前job裏的每個map輸出結果然後不斷的merge,最終形成一個文件作爲reduce task的輸入文件。
在reduce 端執行詳細過程:
1.copy過程:拉取數據,reduce進程啓動一些數據copy線程(Fetcher),通過http方式請求map task所在的TaskTrack 獲取map task輸出文件(文件被TaskTracker管理在本地磁盤)。
2.merge階段:merge 動作copy過來的數據先放入內存緩衝區,merge有三種方式:1內存到內存;2內存到磁盤,3磁盤到磁盤默認不啓用第一種。類似map中的過程,當到達閾值時也會spill,如果設置combiner也會啓用,
在磁盤溢寫了很多文件,直到map端沒有數據,第二種merge方式結束。然後啓用第三種方式merge生成最終的哪個文件
3.reduce的輸入文件:最後生成的那個文件默認存在磁盤中shuffle結束,然後執行reducer,把結果放到HDFS上

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章