MapReduce程式設計
阿新 • • 發佈:2018-11-09
MapReduce Coding Criteria
單個MapReduce
單元運算
- 以
WordCount
為例 - 分別編寫Map和Reduce函式
- 編寫
main
方法,設定環境變數,進行註冊:
二超程式設計
Join
- 對於
input
,來自不同的關係表,對於MapReduce
而言都是檔案 - 在
Map
過程中,需要標記來自哪個關係表- 把來自 R的每個元組
<a,b >
轉換成一個鍵值對<b, <R,a >>
- 把來自 S的每個元組
<b,c >
,轉換成一個鍵值對<b,<S,c>>
- 把來自 R的每個元組
Reduce
過程- 具有相同 B值的元組被髮送到同一個
Reduce
中 - 來自 關係 R和S的、具有相同屬性 B值的元組進行合併
- 輸出則是連線後的元組
<a,b,c >
,通常寫到一個單獨的輸出檔案中
- 具有相同 B值的元組被髮送到同一個
對於二元運算,例如Join
、交集
、並集
都差不多,首先需要標記來自哪個關係表,然後再處理。
組合式MapReduce
- 將任務劃分為若干子任務,各任務之間存在依賴關係
- 多次
Join
也可以認為是組合式的任務
程式實現
隱式依賴描述
- 如何表示
Job
之間有依賴關係- 自己程式設計實現:
顯式依賴描述
- 好處:
- 系統能拿到排程資訊,避免上個程式執行失敗導致後面出錯
- 如果自己程式設計,例如
J4/J5
都依賴於J3
,其中J4/J5
一定會有一個順序,而如果讓系統排程,可以利用排程策略效率最大化(通常短作業優先)
- 在config中實現:
鏈式MapReduce
- 例子:詞頻統計後,過濾掉詞頻高於10的
WordCount
程式已經寫好,不能修改Map
可以串很多ChainMapper
,Reducer
也可以串很多ChainReducer
- 注意,這裡的
ChainReducer
為Mapper
-
- 注意,這裡的
規則
- 整個
Job
只有一個Reduce
- 整個框架只允許一次
Shuffle
- 進行
Map
不會造成資料重新排列,不會改變MapReduce
整體框架
- 整個框架只允許一次
程式設計實現
迭代MapReduce
- 許多機器學習演算法都需要進行迭代(牛頓迭代、EM演算法)
- 迭代式任務的特徵:
- 整個任務一系列子的迴圈構成
- 子任務的執行操作是完全相同的
- 一個子任務的輸出是下一個子任務的輸入
- 一個子任務是一個MapReduce Job
- 迭代多少次,就相當於執行多少次
MapReduce
- 迭代
MapReduce
示意- 每一迭代結束時才將結果寫入
HDFS
,下一步將結果讀出 - 非常浪費資源和IO
- 每一迭代結束時才將結果寫入
程式設計
runlteration()
實現一個MapReduce Job
-
- 判斷條件為滿足閾值或者迭代次數
- 有時候並不關心具體的精確數值,只關心偏序關係(
PageRank
)
- 有時候並不關心具體的精確數值,只關心偏序關係(
Distribute Cache
- 當表的大小差異很大時,使用
Join
會導致大量的資料移動:- 程式設計時將
小表
廣播出去(每個節點上發一份,移動計算) - 例如,在
Kmeans
中,可以將中心點
廣播出去
- 程式設計時將
程式設計實現
-
宣告
-
Job job= new Job(); job.addCacheFile (new Path(filename).toUri ());
-
-
使用
-
Path[] localPaths = context.getLocalCacheFiles();
-
Hadoop Streaming
-
Hadoop
基於Java開發,但MapReduce
程式設計不僅限於Java
語言 -
提供一個程式設計工具,可以允許使用者使用任何可執行檔案
- 但可能會有bug
-
多種語言混合程式設計
-
原理
-
-