1. 程式人生 > >MapReduce程式設計

MapReduce程式設計

MapReduce Coding Criteria

單個MapReduce

單元運算

  • WordCount為例
  • 分別編寫Map和Reduce函式
    • 53906415912
    • 53906420829
  • 編寫main方法,設定環境變數,進行註冊:
    • 53906430243

二超程式設計

Join

  • 對於 input,來自不同的關係表,對於MapReduce而言都是檔案
  • Map過程中,需要標記來自哪個關係表
    • 把來自 R的每個元組 <a,b >轉換成一個鍵值對 <b, <R,a >>
      ,其中的鍵就是屬性 B的值
    • 把來自 S的每個元組 <b,c >,轉換成一個鍵值對<b,<S,c>>
  • Reduce 過程
    • 具有相同 B值的元組被髮送到同一個 Reduce
    • 來自 關係 R和S的、具有相同屬性 B值的元組進行合併
    • 輸出則是連線後的元組 <a,b,c >,通常寫到一個單獨的輸出檔案中

對於二元運算,例如Join交集並集都差不多,首先需要標記來自哪個關係表,然後再處理。

組合式MapReduce

  • 將任務劃分為若干子任務,各任務之間存在依賴關係
  • 多次Join也可以認為是組合式的任務
    • 53906458982

程式實現

隱式依賴描述

  • 如何表示Job之間有依賴關係
    • 自己程式設計實現:
    • 53906461595

顯式依賴描述

  • 好處:
    • 系統能拿到排程資訊,避免上個程式執行失敗導致後面出錯
    • 如果自己程式設計,例如J4/J5都依賴於J3,其中J4/J5一定會有一個順序,而如果讓系統排程,可以利用排程策略效率最大化(通常短作業優先)
  • 在config中實現:
    • 53906537693

鏈式MapReduce

  • 例子:詞頻統計後,過濾掉詞頻高於10的
  • WordCount程式已經寫好,不能修改
  • Map可以串很多ChainMapperReducer也可以串很多ChainReducer
    • 注意,這裡的ChainReducerMapper
    • 53906544142

規則

  • 整個Job只有一個Reduce
    • 整個框架只允許一次Shuffle
    • 進行Map不會造成資料重新排列,不會改變MapReduce整體框架

程式設計實現

53906548744

迭代MapReduce

  • 許多機器學習演算法都需要進行迭代(牛頓迭代、EM演算法)
  • 迭代式任務的特徵:
    • 整個任務一系列子的迴圈構成
    • 子任務的執行操作是完全相同的
    • 一個子任務的輸出是下一個子任務的輸入
    • 一個子任務是一個MapReduce Job
  • 迭代多少次,就相當於執行多少次MapReduce
  • 迭代MapReduce示意
    • 每一迭代結束時才將結果寫入HDFS,下一步將結果讀出
    • 非常浪費資源和IO

程式設計

  • runlteration()實現一個MapReduce Job
    • 53906557784
  • 判斷條件為滿足閾值或者迭代次數
    • 有時候並不關心具體的精確數值,只關心偏序關係(PageRank

Distribute Cache

  • 當表的大小差異很大時,使用Join會導致大量的資料移動:
    • 程式設計時將小表廣播出去(每個節點上發一份,移動計算)
    • 53906571420
    • 53906574912
    • 例如,在Kmeans中,可以將中心點廣播出去

程式設計實現

  • 宣告

    • Job job= new Job(); 
      job.addCacheFile (new Path(filename).toUri ());
      
  • 使用

    • Path[] localPaths = context.getLocalCacheFiles();
      

Hadoop Streaming

  • Hadoop基於Java開發,但MapReduce程式設計不僅限於Java語言

  • 提供一個程式設計工具,可以允許使用者使用任何可執行檔案

    • 但可能會有bug
  • 多種語言混合程式設計

  • 原理

    • 53906590241