MapTask工作機制

2021-09-29 10:10:45 字數 1971 閱讀 7434

1 並行度決定機制

1)問題引出

maptask的並行度決定map階段的任務處理併發度,進而影響到整個job的處理速度。那麼,maptask並行任務是否越多越好呢?

這種說法是不對的,maptask多的話,消耗的資源就多(cpu,記憶體等等);maptask少的話,執行效率就會變低。

2)maptask並行度決定機制

乙個job

的map

階段maptask

並行度(個數),由客戶端提交

job時的切片個數決定。

階段: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

,則寫入檔案之前,對每個分割槽中的資料進行一次聚集操作。 步驟

3:將分割槽

資料的元資訊寫到記憶體索引資料結構spillrecord中

,其中每個分割槽

的元資訊包括在臨時檔案中的偏移量、壓縮前資料大小和壓縮後資料大小。如果當前記憶體索引大小超過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工作機制

maptask並行度決定map階段的任務處理併發度,進而影響job的處理速度 maptask 並行度決定機制 乙個job的map階段並行度 個數 由客戶端提交job時的切片個數決定 乙個job的map階段並行度由客戶端在提交job時決定 每乙個split切片分配乙個maptask 預設 切片大小 b...

MapTask的工作機制

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