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 函式中處理完成以...