MapTask工作機制

2021-09-30 17:13:55 字數 1919 閱讀 8296

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

maptask 並行度決定機制

乙個job的map階段並行度(個數) 由客戶端提交job時的切片個數決定

乙個job的map階段並行度由客戶端在提交job時決定

每乙個split切片分配乙個maptask

預設 切片大小=blocksize

切片時不考慮資料集整體,而是逐個對每乙個檔案單獨切片

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 最終只生成乙個資料檔案,可避免同時開啟大量檔案和同時讀取大量

小檔案產生的隨機讀取帶來的開銷。

MapTask工作機制

階段 maptask 通過使用者編寫的 recordreader 從輸入 inputsplit 中解析出乙個個 key value。2 map 階段 該節點主要是將解析出的 key value 交給使用者編寫 map 函式處理,並產生一系列新的 key value。3 collect 收集階段 在使...

MapTask工作機制

1 並行度決定機制 1 問題引出 maptask的並行度決定map階段的任務處理併發度,進而影響到整個job的處理速度。那麼,maptask並行任務是否越多越好呢?這種說法是不對的,maptask多的話,消耗的資源就多 cpu,記憶體等等 maptask少的話,執行效率就會變低。2 maptask並...

MapTask的工作機制

maptask 主要包含四個階段 read階段 map階段 collect階段 溢寫階段 merge階段 maptask工作流程簡述 public class extends collect收集階段,就是將map 輸出的資料採集,然後寫入到環形緩衝區。當資料在使用者自己編寫的map 函式中處理完成以...