向你老婆解釋清楚MapReduce
干巴巴的定義
MapReduce是一種編程模型,用于大規(guī)模數(shù)據(jù)集(大于1TB)的并行運算。概念"Map(映射)"和"Reduce(歸約)",是它們的主要思想,都是從函數(shù)式編程語言里借來的,還有從矢量編程語言里借來的特性。它極大地方便了編程人員在不會分布式并行編程的情況下,將自己的程序運行在分布式系統(tǒng)上。
當(dāng)前的軟件實現(xiàn)是指定一個Map(映射)函數(shù),用來把一組鍵值對映射成一組新的鍵值對,指定并發(fā)的Reduce(歸約)函數(shù),用來保證所有映射的鍵值對中的每一個共享相同的鍵組。
形象的解釋1:統(tǒng)計圖書
我們要數(shù)圖書館中的所有書。你數(shù)1號書架,我數(shù)2號書架,這就是“Map”。我們?nèi)嗽蕉?,?shù)的就更快。
現(xiàn)在我們到一起,把所有人的統(tǒng)計數(shù)加在一起,這就是“Reduce”。
形象的解釋2:統(tǒng)計圖形
我們來看一個關(guān)于圖形統(tǒng)計的MapReduce流程,兩個人負責(zé)把左側(cè)的一堆圖形,按照形狀和顏色歸類統(tǒng)計各自的數(shù)量。
實戰(zhàn):計算平均成績的Java Hadoop MapReduce程序
說了那么多,你老婆可能已經(jīng)理解了MR,但是你可能還無法和程序代碼聯(lián)系起來,下面的這個小例子可以幫助到你,類似的樣例網(wǎng)上很多,去搜索吧,這里簡單分析一下關(guān)鍵代碼,通過標(biāo)注的name和Text key,你需要理解什么是MapReduce中的key以及key的作用。
數(shù)據(jù)環(huán)境:位于Hadoop中的chinese.txt、english.txt、math.txt文件分別記錄了所有學(xué)生的語文、英語、數(shù)學(xué)成績,文件內(nèi)容格式為,姓名 分?jǐn)?shù),中間以空格分隔。
- public class Score {
- public static class ScoreMap extends
- Mapper<LongWritable, Text, Text, IntWritable> {
- // 實現(xiàn)map函數(shù)
- public void map(LongWritable key, Text value, Context context)
- throws IOException, InterruptedException {
- // 將輸入的純文本文件的數(shù)據(jù)轉(zhuǎn)化成String
- String line = value.toString();
- // 將輸入的數(shù)據(jù)首先按行進行分割
- StringTokenizer tokenizerArticle = new StringTokenizer(line, "\n");
- // 分別對每一行進行處理
- while (tokenizerArticle.hasMoreElements()) {
- // 每行按空格劃分
- StringTokenizer tokenizerLine = new StringTokenizer(tokenizerArticle.nextToken());
- String strName = tokenizerLine.nextToken();// 學(xué)生姓名部分
- String strScore = tokenizerLine.nextToken();// 成績部分
- Text name = new Text(strName);
- int scoreInt = Integer.parseInt(strScore);
- // 輸出姓名和成績,以name做為key對分?jǐn)?shù)歸類
- context.write(name, new IntWritable(scoreInt));
- }
- }
- }
- public static class ScoreReduce extends
- Reducer<Text, IntWritable, Text, IntWritable> {
- // 實現(xiàn)reduce函數(shù)
- public void reduce(Text key, Iterable<IntWritable> values,
- Context context) throws IOException, InterruptedException {
- int sum = 0;
- int count = 0;
- Iterator<IntWritable> iterator = values.iterator();
- while (iterator.hasNext()) {
- sum += iterator.next().get();// 計算總分
- count++;// 統(tǒng)計總的科目數(shù)
- }
- int average = (int) sum / count;// 計算平均成績
- context.write(key, new IntWritable(average));
- }
- }
- public static void main(String[] args) throws Exception {
- ...
- // 設(shè)置Map和Reduce處理類
- job.setMapperClass(ScoreMap.class);
- job.setReducerClass(ScoreReduce.class);
- ...
- }
- }
***的話
如果你要進一步了解MR,***的方法就是從頭成功運行一個hello world程序,通過一次成功的實踐,你會發(fā)現(xiàn)MR這東西實在太簡單了,否則說明你還沒有成功運行過***個小程序。實踐!實踐!實踐!
【本文為51CTO專欄作者“朱國立”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號“開發(fā)者圓桌”獲取聯(lián)系和授權(quán)】