大資料學習筆記(十七)-MapReduce

狂暴棕熊發表於2018-01-04

1.在MapReduce中被分成了兩類,map操作和reduce操作,1個job是由若干次map操作和1次reduce操作組成的。
在MapReduce中,最重要的就是理解資料在處理時都是以Key/Value形式輸入輸出的(在資料初始讀入時,也是以Key/Value形式讀入的)
2.對map、reduce操作的理解
①map是對映:簡單理解的話可以理解成遍歷原有資料集中的所有資料,針對每一條資料都用相同的邏輯對資料進行處理,然後再產生新的資料集。因為是遍歷操作,所以每條資料都是獨立的,所以是可以並行的,分佈在不同機器上進行運算。
②reduce是歸約:所謂的歸約可以理解成框架將資料集按照Key值生成一個Value的List,在reduce回撥方法中,可以這些資料進行處理。因為要將Key值相同的資料集中在一起進行處理,所以會有網路IO/磁碟IO,也就是shuffle,因此並行度低,執行速度慢。
3.使用MapReduce處理資料
①初學MapReduce,學習的是WordCount Example,在這個例子裡的job是由1次map和1次reduce組成的,對於比較簡單的邏輯這樣就可以了,但是一個job實際上是可以由多次map和1次Reduce組成的。
②處理更復雜的邏輯需要在reduce前執行多次map操作或者再reduce操作後也需要使用map操作對reduce產生的結果進行處理,這個時候就可以使用ChainMapper來實現reduce前的多次map操作,reduce之後要執行map操作可以使用ChainReducer來實現。
③在更復雜的一些情況下,可能需要經過多次reduce,這個時候只需要在寫Driver時順序的寫多個job設定前一個job的輸出為後一個job的輸入就可以了,每個job間以

job.waitForCompletion(true);

提交作業就可以順序的執行多個job了。

我自己的感覺是,MapReduce可以用來做資料的初次ETL,將資料完成整理之後,使用Hive來做後續的處理,因為HQL能夠提供更好更簡單的資料處理方法。比如group by和join,實現起來還是挺複雜的。

但是這就看出MapReduce的侷限了。Spark就提供了對應的運算元,可以實現複雜的資料運算。

4.使用MapReduce實現連線操作時,需要兩個對映器(Mapper),此時可以使用MultipleInputs類來達到使用多個對映器,如果只有一個對映器則是用之前的job.setMapperClass()來實現。

相關文章