文章目錄
- 1 流程示意圖
- 2 解析
1 流程示意圖
2 解析
- 假如我們有一個檔案ss.txt大小為200M的待處理檔案,放在input目錄下
- 用戶端在submit job之前,擷取待處理資料的資訊, 然後根據參數配置, 形成一個任務配置設定的規劃.把待處理的檔案進行切片,200M大小的檔案切成兩個分區.
ss.txt 0 - 128M 第一個分區
ss.txt 128 - 200M 第二個分區
- 用戶端把切片資訊還有需要的jar包和配置檔案送出送出到Yarn 路徑(如果是本地的話送出到本地路徑)
- 如果是送出到yarn,yarn中的Mr appmaster 會擷取資訊,根據切片資訊計算出MapTask的數量(一般是多少個切片多少個Task),建立MapTask分别處理一個切片.
- MapTask 中的InputFormat 中的RecorderReader會讀取檔案(按照配置的InputFormat的規則讀,預設是TextInputFormat,按行讀),擷取k-v鍵值對.
- 讀完的資料,會進入使用者定義的Mapper中進行邏輯運算.
-
Mapper 中處理完資料之後會把處理後的資料送出給outputCollector,然後outputCollector會把資料存儲在環形緩沖區中.
環形緩沖區中左邊存儲中繼資料(資料資訊),右邊會存儲資料(真正的k-v值),在寫滿環形緩沖區總容量(預設是100M)的80%時,會發生溢寫(把環形緩沖區的資料寫到磁盤中),然後環形緩沖區會反向存儲資料(因為前面的資料已經存到磁盤中了,是以前面的資料已經沒用,可以覆寫).
- 環形緩沖區會根據分區資訊,對資料進行分區處理,各分區的資料進行排序(這個步驟是在環形緩沖區中進行的,沒溢寫之前,排序的算法是快排).
-
然後就溢寫到檔案
(每滿80% 會溢寫到一個檔案,是以一個分區有好多的檔案,而且每個檔案内部已經進行過排序的)
在溢寫到檔案之前可以選擇性采用Combiner 對 先進行合并
(原來沒有Combiner,資料在各個檔案之間會有相同key值,而Combiner是把所有相同的key值得value相加到一起)(Combiner有使用限制的)
-
merge 同一個分區的所有檔案到一個檔案
(這個步驟是用歸并排序對已經排好序的同一個分區的檔案進行合并,并且合并後檔案的資料也是排好序的).**到這裡Mapper階段的工作完成.**然後Mapper Task等待 Reducer Task來拉取資料.
- 請看 9).
- 所有MapTask任務完成後,啟動相應數量的ReduceTask(多少分區啟動多少ReduceTask),并告知ReduceTask處理資料範圍(資料分區)
- ReduceTask會去拉取資料.(一個ReduceTask隻處理一個分區的資料,是以一個ReduceTask隻拉取一個分區的資料).把各個Mapper Task生成的檔案通過歸并排序合成一個有序的檔案,而且把相同key值的value值相加.
- 然後會進入使用者定義的Reducer一組一組的對資料進行邏輯處理.
- 對資料進行分組處理(這步是可選的)
-
通過OutputFormat輸出資料(預設是TextOutputFormat
),整個過程完成.