文章轉載自「開發者圓桌」一個關於開發者入門、進階、踩坑的微信公衆號編程
乾巴巴的定義小程序
MapReduce是一種編程模型,用於大規模數據集(大於1TB)的並行運算。概念"Map(映射)"和"Reduce(歸約)",是它們的主要思想,都是從函數式編程語言裏借來的,還有從矢量編程語言裏借來的特性。它極大地方便了編程人員在不會分佈式並行編程的狀況下,將本身的程序運行在分佈式系統上。 微信
當前的軟件實現是指定一個Map(映射)函數,用來把一組鍵值對映射成一組新的鍵值對,指定併發的Reduce(歸約)函數,用來保證全部映射的鍵值對中的每個共享相同的鍵組。併發
形象的解釋1:統計圖書app
咱們要數圖書館中的全部書。你數1號書架,我數2號書架,這就是「Map」。咱們人越多,數的就更快。編程語言
如今咱們到一塊兒,把全部人的統計數加在一塊兒,這就是「Reduce」。分佈式
形象的解釋2:統計圖形ide
咱們來看一個關於圖形統計的MapReduce流程,兩我的負責把左側的一堆圖形,按照形狀和顏色歸類統計各自的數量。函數式編程
實戰:計算平均成績的Java Hadoop MapReduce程序函數
說了那麼多,你老婆可能已經理解了MR,可是你可能還沒法和程序代碼聯繫起來,下面的這個小例子能夠幫助到你,相似的樣例網上不少,去搜索吧,這裏簡單分析一下關鍵代碼,經過標註的name和Text key,你須要理解什麼是MapReduce中的key以及key的做用。
數據環境:位於Hadoop中的chinese.txt、english.txt、math.txt文件分別記錄了全部學生的語文、英語、數學成績,文件內容格式爲,姓名 分數,中間以空格分隔。
public class Score {
public static class ScoreMap extends
Mapper<LongWritable, Text, Text, IntWritable> {
// 實現map函數
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
// 將輸入的純文本文件的數據轉化成String
String line = value.toString();
// 將輸入的數據首先按行進行分割
StringTokenizer tokenizerArticle = new StringTokenizer(line, "\n");
// 分別對每一行進行處理
while (tokenizerArticle.hasMoreElements()) {
// 每行按空格劃分
StringTokenizer tokenizerLine = new StringTokenizer(tokenizerArticle.nextToken());
String strName = tokenizerLine.nextToken();// 學生姓名部分
String strScore = tokenizerLine.nextToken();// 成績部分
Text name = new Text(strName);
int scoreInt = Integer.parseInt(strScore);
// 輸出姓名和成績,以name作爲key對分數歸類
context.write(name, new IntWritable(scoreInt));
}
}
}
public static class ScoreReduce extends
Reducer<Text, IntWritable, Text, IntWritable> {
// 實現reduce函數
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++;// 統計總的科目數
}
int average = (int) sum / count;// 計算平均成績
context.write(key, new IntWritable(average));
}
}
public static void main(String[] args) throws Exception {
...
// 設置Map和Reduce處理類
job.setMapperClass(ScoreMap.class);
job.setReducerClass(ScoreReduce.class);
...
}
}
最後的話
若是你要進一步瞭解MR,最好的方法就是從頭成功運行一個hello world程序,經過一次成功的實踐,你會發現MR這東西實在太簡單了,不然說明你尚未成功運行過第一個小程序。實踐!實踐!實踐!