天天看點

十四 MapReduce工作流程1 流程示意圖2 解析

文章目錄

  • 1 流程示意圖
  • 2 解析

1 流程示意圖

十四 MapReduce工作流程1 流程示意圖2 解析
十四 MapReduce工作流程1 流程示意圖2 解析

2 解析

  1. 假如我們有一個檔案ss.txt大小為200M的待處理檔案,放在input目錄下
  2. 用戶端在submit job之前,擷取待處理資料的資訊, 然後根據參數配置, 形成一個任務配置設定的規劃.把待處理的檔案進行切片,200M大小的檔案切成兩個分區.
ss.txt  0 - 128M  第一個分區
ss.txt  128 - 200M  第二個分區
           
  1. 用戶端把切片資訊還有需要的jar包和配置檔案送出送出到Yarn 路徑(如果是本地的話送出到本地路徑)
  2. 如果是送出到yarn,yarn中的Mr appmaster 會擷取資訊,根據切片資訊計算出MapTask的數量(一般是多少個切片多少個Task),建立MapTask分别處理一個切片.
  3. MapTask 中的InputFormat 中的RecorderReader會讀取檔案(按照配置的InputFormat的規則讀,預設是TextInputFormat,按行讀),擷取k-v鍵值對.
  4. 讀完的資料,會進入使用者定義的Mapper中進行邏輯運算.
  5. Mapper 中處理完資料之後會把處理後的資料送出給outputCollector,然後outputCollector會把資料存儲在環形緩沖區中.

    環形緩沖區中左邊存儲中繼資料(資料資訊),右邊會存儲資料(真正的k-v值),在寫滿環形緩沖區總容量(預設是100M)的80%時,會發生溢寫(把環形緩沖區的資料寫到磁盤中),然後環形緩沖區會反向存儲資料(因為前面的資料已經存到磁盤中了,是以前面的資料已經沒用,可以覆寫).

  6. 環形緩沖區會根據分區資訊,對資料進行分區處理,各分區的資料進行排序(這個步驟是在環形緩沖區中進行的,沒溢寫之前,排序的算法是快排).
  7. 然後就溢寫到檔案

    (每滿80% 會溢寫到一個檔案,是以一個分區有好多的檔案,而且每個檔案内部已經進行過排序的)

    在溢寫到檔案之前可以選擇性采用Combiner 對 先進行合并

    (原來沒有Combiner,資料在各個檔案之間會有相同key值,而Combiner是把所有相同的key值得value相加到一起)(Combiner有使用限制的)

  8. merge 同一個分區的所有檔案到一個檔案

    (這個步驟是用歸并排序對已經排好序的同一個分區的檔案進行合并,并且合并後檔案的資料也是排好序的).**到這裡Mapper階段的工作完成.**然後Mapper Task等待 Reducer Task來拉取資料.

  9. 請看 9).
  10. 所有MapTask任務完成後,啟動相應數量的ReduceTask(多少分區啟動多少ReduceTask),并告知ReduceTask處理資料範圍(資料分區)
  11. ReduceTask會去拉取資料.(一個ReduceTask隻處理一個分區的資料,是以一個ReduceTask隻拉取一個分區的資料).把各個Mapper Task生成的檔案通過歸并排序合成一個有序的檔案,而且把相同key值的value值相加.
  12. 然後會進入使用者定義的Reducer一組一組的對資料進行邏輯處理.
  13. 對資料進行分組處理(這步是可選的)
  14. 通過OutputFormat輸出資料(預設是TextOutputFormat

    ),整個過程完成.

繼續閱讀