MapReduce的理解部分
阿新 • • 發佈:2020-12-26
1)MapReduce的基本介紹: 分散式計算框架
思想: 分而治之
map: 負責 分 的過程
reduce: 負責 合 的過程
2)MapReduce的程式設計規範步驟
天龍八步:
map階段: 2步
1) 讀取資料, 將讀取過來的資料轉換為 k1 和 v1
2) 自定義map邏輯, 將 k1 和 v1 轉換為 k2 和 v2
shuffle階段: 4步 接收 map階段的k2和 v2 轉換為 new k2和 v2
3) 分割槽 : 將相同的k2的資料發往同一個reduce
4) 排序 : 針對 k2 的資料 進行排序工作
6) 分組 : 將相同k2的資料分成一組, 將v2的資料合併形成一個集合
reduce階段: 2步
7) 自定義reduce邏輯, 接收k2 和 v2的資料, 將其轉換為 k3 和 v3
8) 輸出結果, 將k3 和 v3 輸出到目的地
–而 k2 就是 整個MR的靈魂
3)MapReduce的並行度機制
何為並行度: 在執行MR的時候, map執行的數量 以及 reduce執行數量 有誰來決定的問題 map執行的數量 取決於 讀取檔案的大小, 預設情況下, 是按照 128M 一個Map來處理, 同時每一個檔案至少會有一個map來讀取 MR 對整個檔案進行讀取工作, 然後對整個檔案進行邏輯劃分(FileSplit)---檔案切片 reduce執行數量: 一般有人為來設定的, 當業務需求要求結果是多個檔案的時候, 這個時候一般就要設定reduce的數量 一個reduce就會輸出一個聚合結果, 多個reduce就會輸出多個聚合結果 如果只有一個reduce, 一般聚合結果, 最終聚合結果, 而如何使用多個reduce, 將聚合結果, 拆分多半 同時reduce數量 還取決於分割槽的數量, 如果進行自定義分割槽, 分割槽數量要和reduce是相等的
4)map階段的工作機制:
1) 通過FileInputFormat 讀取目標地址的資料, 通過FileInputFormat對目標資料進行FileSplit的邏輯分片資料, 最終會啟動多少個mapTask取決於 FileSplit的邏輯分片的數量, 讀取後, 將資料轉換為K1和 v1 2) 自定義map邏輯, 接收k1和v1, 將k1和v1 轉換為 k2和v2: 前序讀取一行, 呼叫一次map邏輯, 輸出k2和v2 3) 進行分割槽操作: map端輸出一次k2和v2, 那麼分割槽邏輯就會對k2進行分割槽操作, 預設採用HASH取模計演算法, 計算後, 對k2進行分割槽標記 然後將標記好的k2和v2寫入到 環形緩衝區 4) 隨著不斷寫入到環形緩衝區, 環形緩衝區預設的大小為100M, 當達到緩衝區的80%的時候, MR會啟動一個溢寫執行緒, 將80%資料寫出到磁碟中, 形成一個 臨時檔案, 在執行溢寫過程中, 還會對k2資料進行排序操作, 如果設定了規約, 那麼也就會在這個時候執行了 5) 不斷的寫入, 不斷的溢寫 , 產生多個臨時檔案, 當mapTask執行完成後, 會將最後的緩衝區的資料一併寫出磁碟上, 然後開始進行合併操作. 保證一個 MapTask 只會產生一個最終的結果檔案, 在合併的過程中, 同樣也會進行排序, 並且有規約依然還會執行操作 6) 當mapTask的結果檔案形成後, 靜靜等待reduceTask的拉取即可 shuffle中: 分割槽 排序 規約 屬於 map端的shuffle過程
5)reduce階段的工作流程:
1) 當map執行完成後, reduce開始執行拉取工作, 每一個reduce到mapTask執行的結果檔案中, 拉取屬於自己分割槽的資料
2) 將資料首先拉取到記憶體中, 當記憶體寫滿後, 將資料溢寫到磁碟上, 形成多個臨時檔案, 在溢寫的時候, 依然會對資料進行排序
3) 當整個拉取工作結束後, 對多個臨時檔案資料執行merge(合併)操作 , 將多個臨時檔案合併為一個結果檔案, 同時合併過程依然排序
4) 對合並後的結果檔案, 開始執行分組操作, 分好一組資料後, 就會呼叫一次reduce的邏輯, reduce接收k2和v2的資料, 將其轉換為k3和v3
5) reduce每輸出一次 k3和v3, 就會被FileOutPutFormat 接收到, 然後將資料追加到結果檔案上
6) 當整個reducer將所有的分組資料都處理完成, 結果檔案, 也就產生了...
shuffle中: 分組 屬於 reduce的shuffle過程