Hadoop的shuffle

Shuffle描述的是數據從Map端到Reduce端的過程,大致分爲排序(sort)、溢寫(spill)、合併(merge)、拉取拷貝(Copy)、合併排序(merge sort)這幾個過程,大體流程如下:
在這裏插入圖片描述
上圖的Map的輸出的文件被分片爲紅綠藍三個分片,這個分片的就是根據Key爲條件來分片的,分片算法可以自己實現,例如Hash、Range等,最終Reduce任務只拉取對應顏色的數據來進行處理,就實現把相同的Key拉取到相同的Reduce節點處理的功能。下面分開來說Shuffle的的各個過程。

Map端做了下圖所示的操作:
在這裏插入圖片描述
1、Map端sort

Map端的輸出數據,先寫環形緩存區kvbuffer,當環形緩衝區到達一個閥值(可以通過配置文件設置,默認80),便要開始溢寫,但溢寫之前會有一個sort操作,這個sort操作先把Kvbuffer中的數據按照partition值和key兩個關鍵字來排序,移動的只是索引數據,排序結果是Kvmeta中數據按照partition爲單位聚集在一起,同一partition內的按照key有序。

2、spill(溢寫)

當排序完成,便開始把數據刷到磁盤,刷磁盤的過程以分區爲單位,一個分區寫完,寫下一個分區,分區內數據有序,最終實際上會多次溢寫,然後生成多個文件

3、merge(合併)

spill會生成多個小文件,對於Reduce端拉取數據是相當低效的,那麼這時候就有了merge的過程,合併的過程也是同分片的合併成一個片段(segment),最終所有的segment組裝成一個最終文件,那麼合併過程就完成了,如下圖所示

在這裏插入圖片描述
至此,Map的操作就已經完成,Reduce端操作即將登場

Reduce操作

總體過程如下圖的紅框處:

在這裏插入圖片描述
1、拉取拷貝(fetch copy)

Reduce任務通過向各個Map任務拉取對應分片。這個過程都是以Http協議完成,每個Map節點都會啓動一個常駐的HTTP server服務,Reduce節點會請求這個Http Server拉取數據,這個過程完全通過網絡傳輸,所以是一個非常重量級的操作。

2、合併排序

Reduce端,拉取到各個Map節點對應分片的數據之後,會進行再次排序,排序完成,結果丟給Reduce函數進行計算。

總結

至此整個shuffle過程完成,最後總結幾點:

1、shuffle過程就是爲了對key進行全局聚合

2、排序操作伴隨着整個shuffle過程,所以Hadoop的shuffle是sort-based的

轉載自
https://my.oschina.net/u/1778239/blog/3018432

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