MapReduce函數的輸入與輸出(week 12)


MapReduce是大數據分布式計算框架,是大數據技術的一個核心。它主要有兩個函數,Map() 和 Reduce()。直接使用MapReduce的這兩個函數編程有些困難,所以Facebook推出了Hive。Hive支持使用 SQL 語法來進行大數據計算,比如說你可以寫個 Select 語句進行數據查詢,然后 Hive 會把 SQL 語句轉化成 MapReduce 的計算程序。這樣,熟悉數據庫的數據分析師和工程師便可以無門檻地使用大數據進行數據分析和處理了。 但與此同時,Hive也把大數據分布式計算框架的核心知識點隱藏了。本文通過一個例子來解析一個Hive例子,將其還原到MapReduce函數,來理解MapReduce的核心思想與方法。

問題

分析如下 HiveQL,生成的 MapReduce 執行程序,map 函數輸入是什么?輸出是什么,reduce 函數輸入是什么?輸出是什么?

1 INSERT OVERWRITE TABLE pv_users
2 SELECT pv.pageid, u.age
3 FROM page_view pv
4    JOIN user u
5    ON (pv.userid = u.userid);

page_view 表和 user 表結構與數據示例如下

 

解析過程

該HiveQL語句是查詢所有<pageid, age>的組合,而這兩個信息分屬不同的表,將這兩者連接在一起的是userid。既然要處理兩個表的數據,那么會有兩個Map()函數,

  1. 第一個Map()函數統計page_view表。它的輸入<key, value>中value是page_view的數據記錄,輸出的<key, value>中,key是userid,value是表名和pageid的組合;
  2. 第二個Map()函數統計user表。它的輸入<key, value>中value是表記錄,輸出<key, value>中key是userid,value是表名和age的組合。

用userid做為Map()函數輸出<key, value>中的key是一個關鍵信息,因為在Shuffle過程中需要用userid來將Map()的輸出數據分類組合,然后傳給Reduce()函數中。Reduce()函數的輸入<key, values>中key是userid,values是來自於表1的pageid或者是來自於表2的age。Reduce()函數將這些信息整合,得到的輸出<key, value>中value就是所有pageid和age的組合,也就是HiveQL查詢想要得到的結果。至此,MapReduce過程結束,實現了HiveQL的查詢結果。

總結

從上面的過程中可以看出,Map()函數將一組數據記錄轉化成一組KeyValue項,而Reduce()函數再將來源於所有Map()函數結果的KeyValue項聚合成一個值。以上面問題為例,假設有10個Map進程運行在10個不同的DB上,每個Map()輸出都是每個userid的訪問記錄pageid和age;然后這個10個Map()結果都會以userid為key傳給Reduce(),Reduce()將所有數據根據userid聚合,從而得出最終結果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM