1. 程式人生 > >MapTask工作機制

MapTask工作機制

maptask並行度決定map階段的任務處理併發度,進而影響job的處理速度

MapTask 並行度決定機制

一個job的map階段並行度(個數) 由客戶端提交job時的切片個數決定
在這裡插入圖片描述

  1. 一個job的map階段並行度由客戶端在提交job時決定
  2. 每一個split切片分配一個mapTask
  3. 預設 切片大小=blocksize
  4. 切片時不考慮資料集整體,而是逐個對每一個檔案單獨切片

MapTask工作機制

在這裡插入圖片描述
Read階段;
讀檔案

輸入檔案對檔案切片的規劃
在這裡插入圖片描述
Map階段:
業務邏輯
在這裡插入圖片描述
Collect階段:
分割槽 排序
溢寫階段:
寫磁碟
Combine階段:
歸併

(1)Read 階段:Map Task 通過使用者編寫的 RecordReader,從輸入 InputSplit 中解析出
一個個 key/value。
(2)Map 階段:該節點主要是將解析出的 key/value 交給使用者編寫 map()函式處理,並
產生一系列新的 key/value。
(3)Collect 收集階段:在使用者編寫 map()函式中,當資料處理完成後,一般會呼叫
OutputCollector.collect()輸出結果。在該函式內部,它會將生成的 key/value 分割槽(呼叫
Partitioner),並寫入一個環形記憶體緩衝區中。
(4)Spill 階段:即“溢寫”,當環形緩衝區滿後,MapReduce 會將資料寫到本地磁碟上,
生成一個臨時檔案。需要注意的是,將資料寫入本地磁碟之前,先要對資料進行一次本地排
序,並在必要時對資料進行合併、壓縮等操作。
溢寫階段詳情:
步驟 1:利用快速排序演算法對快取區內的資料進行排序,排序方式是,先按照分割槽編號
partition 進行排序,然後按照 key 進行排序。這樣,經過排序後,資料以分割槽為單位聚集在
一起,且同一分割槽內所有資料按照 key 有序。
步驟 2:按照分割槽編號由小到大依次將每個分割槽中的資料寫入任務工作目錄下的臨時文
件 output/spillN.out(N 表示當前溢寫次數)中。如果使用者設定了 Combiner,則寫入檔案之
前,對每個分割槽中的資料進行一次聚集操作。
資訊包括在臨時檔案中的偏移量、壓縮前資料大小和壓縮後資料大小。如果當前記憶體索引大
小超過 1MB,則將記憶體索引寫到檔案 output/spillN.out.index 中。
(5)Combine 階段:當所有資料處理完成後,MapTask 對所有臨時檔案進行一次合併,
以確保最終只會生成一個數據檔案。
當所有資料處理完後,MapTask 會將所有臨時檔案合併成一個大檔案,並儲存到檔案
output/file.out 中,同時生成相應的索引檔案 output/file.out.index。
在進行檔案合併過程中,MapTask 以分割槽為單位進行合併。對於某個分割槽,它將採用多
輪遞迴合併的方式。每輪合併 io.sort.factor(預設 100)個檔案,並將產生的檔案重新加入
待合併列表中,對檔案排序後,重複以上過程,直到最終得到一個大檔案。
讓每個 MapTask 最終只生成一個數據檔案,可避免同時開啟大量檔案和同時讀取大量
小檔案產生的隨機讀取帶來的開銷。