MapReduce 四種基本設計模式
這篇文章討論了 MapReduce design patterns的四種基本設計模式:
1. Input-Map-Reduce-Output
2. Input-Map-Output
3. Input-Multiple Maps-Reduce-Output
4. Input-Map-Combiner-Reduce-Output
下面是一些真實場景,幫助你理解,什么時候使用那種模式更為恰當。
Input-Map-Reduce-Output
如果需要進行聚合操作,就要使用到這種模式。
為了計算不同性別人員的總工資,我們需要生成以性別為鍵,以薪水為值的鍵值對,鍵值對進行Map操作的結果如下:
將相同key的value放到一個集合中,給Reduce操作提供以下數據:
Reduce操作后的結果如下:
Input-Map-Output
Reduce操作最常見的用法是 集合計算 ,如果僅僅希望改變數據格式,那么使用Input-Map-Output模式。
在Input-Multiple Maps-Reduce-Output設計模式中,我們從2個文件中獲取數據,每個有不同的語法,(注意:雖然是多個文件,但是有相同的語法,那么沒有必要使用2個映射器,我們可以簡單的提供不同的輸入文件路徑解決,在一個映射器中使用相同的邏輯即可。)
這個模式也被在 Reduce-Side Join 中使用:
Input-Map-Combiner-Reduce-Output
Apache Spark 對于操作大和小的數據處理任務是非常高效的,不僅僅因為它重新造了輪子,而且它放大了進行有效分析的現有工具。它在商用級硬件上的高度可擴展性,和其他知名大數據處理引擎相比,它擁有令人難以置信的性能,Spark可能終將讓軟件蠶食世界。
Combiner,也被稱為半個Reduce,是一個可選的類,它接收Map類的輸入然后將鍵值對傳遞給Reducer類。Combiner函數的目的是降低Reducer的工作量。
在一個MapReduce程序里, 20%的工作在Map階段完成, 這也是一個數據準備的階段,這個階段的工作是并行進行的。
80% 的工作在Reducer階段完成, 這也稱為計算階段.。這個階段工作不是并行進行的,所以比Map階段慢。為了減少計算時間,可以將Reducer階段的部分工作移動到Combiner階段完成。
Scenario
現有多個部門,我們需要按照不同部門計算總工資,然后再按照性別計算總工資。而且,在計算總和時還有額外的條件。按性別計算各部門的總數之后:
如果總部門工資大于200K,在總數上增加25K。
如果總部門工資大于100K,在總數上增加10K。
來自:https://coyee.com/article/11094-mapreduce-design-patterns