1. MapReduce基本編程模型和框架
1.1 MapReduce抽象模型
大數據計算的核心思想是:分而治之。如下圖所示。把大量的數據划分開來,分配給各個子任務來完成。再將結果合並到一起輸出。注:如果數據的耦合性很高,不能分離,那么這種並行計算就不合適了。
圖1: MapReduce抽象模型
1.2 Hadoop的MapReduce的並行編程模型
如下圖2所示,Hadoop的MapReduce先將數據划分為多個key/value鍵值對。然后輸入Map框架來得到新的key/value對,這時候只是中間結果,這個時候的value值是個集合。再通過同步屏障(為了等待所有的Map處理完),這個階段會把相同key的值收集整理(Aggregation&Shuffle)在一起,再交給Reduce框架做輸出組合,如圖2中每個Map輸出的結果,有K1,K2,K3,通過同步屏障后,K2收集到一起,K2收集到一起,K3收集到一起,再分別交給Reduce,通過Reduce組合結果。
圖2:Hadoop的MapReduce的框架
1.3 Hadoop的MapReduce的完整編程模和框架
圖3是MapReduce的完整編程模型和框架,比模型上多加入了Combiner和Partitioner。
-
Combiner
Combiner可以理解為一個小的Reduce,就是把每個Map結果,先做一次整合。例如圖3中第三列的Map結果中有2個good,通過Combiner之后,先將本地的2個goods組合到了一起(紅色的(good,2))。好處是大大減少需要傳輸的中間結果數量,達到網絡數據傳輸優化,這也是Combiner的主要作用。 -
Partitioner
為了保證所有的主鍵相同的key值對能傳輸給同一個Reduce節點,如圖3中所有的good傳給第一個Reduce前,所有的is和has傳給第二個Reduce前,所有的weather,the和today傳到第三個Reduce前。MapReduce專門提供了一個Partitioner類來完成這個工作,主要目的就是消除數據傳入的Reduce節點后帶來不必要的相關性。
圖3:Hadoop的MapReduce的完整編程模型和框架