向你老婆解释清楚MapReduce

开发 开发工具
本文的主要内容是如何通俗易懂的理解MapReduce。

干巴巴的定义

MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)",是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。

当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。

形象的解释1:统计图书

我们要数图书馆中的所有书。你数1号书架,我数2号书架,这就是“Map”。我们人越多,数的就更快。

现在我们到一起,把所有人的统计数加在一起,这就是“Reduce”。

形象的解释2:统计图形

我们来看一个关于图形统计的MapReduce流程,两个人负责把左侧的一堆图形,按照形状和颜色归类统计各自的数量。

图形统计的MapReduce流程

实战:计算平均成绩的Java Hadoop MapReduce程序

说了那么多,你老婆可能已经理解了MR,但是你可能还无法和程序代码联系起来,下面的这个小例子可以帮助到你,类似的样例网上很多,去搜索吧,这里简单分析一下关键代码,通过标注的name和Text key,你需要理解什么是MapReduce中的key以及key的作用。

数据环境:位于Hadoop中的chinese.txt、english.txt、math.txt文件分别记录了所有学生的语文、英语、数学成绩,文件内容格式为,姓名 分数,中间以空格分隔。

  1. public class Score { 
  2.     public static class ScoreMap extends 
  3.             Mapper<LongWritable, Text, Text, IntWritable> { 
  4.         // 实现map函数 
  5.         public void map(LongWritable key, Text value, Context context) 
  6.                 throws IOException, InterruptedException { 
  7.             // 将输入的纯文本文件的数据转化成String 
  8.             String line = value.toString(); 
  9.             // 将输入的数据首先按行进行分割 
  10.             StringTokenizer tokenizerArticle = new StringTokenizer(line, "\n"); 
  11.             // 分别对每一行进行处理 
  12.             while (tokenizerArticle.hasMoreElements()) { 
  13.                 // 每行按空格划分 
  14.                 StringTokenizer tokenizerLine = new StringTokenizer(tokenizerArticle.nextToken()); 
  15.                 String strName = tokenizerLine.nextToken();// 学生姓名部分 
  16.                 String strScore = tokenizerLine.nextToken();// 成绩部分 
  17.                 Text name = new Text(strName); 
  18.                 int scoreInt = Integer.parseInt(strScore); 
  19.                 // 输出姓名和成绩,以name做为key对分数归类 
  20.                 context.write(name, new IntWritable(scoreInt)); 
  21.             } 
  22.         } 
  23.     } 
  24.  
  25.     public static class ScoreReduce extends 
  26.             Reducer<Text, IntWritable, Text, IntWritable> { 
  27.         // 实现reduce函数 
  28.         public void reduce(Text key, Iterable<IntWritable> values, 
  29.                 Context context) throws IOException, InterruptedException { 
  30.             int sum = 0
  31.             int count = 0
  32.             Iterator<IntWritable> iterator = values.iterator(); 
  33.             while (iterator.hasNext()) { 
  34.                 sum += iterator.next().get();// 计算总分 
  35.                 count++;// 统计总的科目数 
  36.             } 
  37.             int average = (int) sum / count;// 计算平均成绩 
  38.             context.write(key, new IntWritable(average)); 
  39.         } 
  40.     } 
  41.     public static void main(String[] args) throws Exception { 
  42.         ... 
  43.         // 设置Map和Reduce处理类 
  44.         job.setMapperClass(ScoreMap.class); 
  45.         job.setReducerClass(ScoreReduce.class); 
  46.        ... 
  47.     } 

***的话

如果你要进一步了解MR,***的方法就是从头成功运行一个hello world程序,通过一次成功的实践,你会发现MR这东西实在太简单了,否则说明你还没有成功运行过***个小程序。实践!实践!实践!

【本文为51CTO专栏作者“朱国立”的原创稿件,转载请通过作者微信公众号“开发者圆桌”获取联系和授权】

戳这里,看该作者更多好文

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2014-11-11 15:46:54

MapReduce算法

2023-07-10 08:59:37

Dubbo通信模式

2024-01-25 11:41:00

Python开发前端

2010-08-12 16:28:35

面试官

2018-01-10 22:28:19

GDPR

2013-06-13 14:05:51

关机程序

2021-05-14 11:26:47

大数据

2021-04-07 18:32:05

黑客网络安全网络攻击

2016-09-09 18:38:30

Wi-Fi地铁免费Wi-Fi

2021-02-23 19:22:27

人工智能AI

2021-10-25 08:49:32

索引数据库MySQL

2010-05-14 11:37:46

网络攻击黑客美国

2018-11-14 14:33:33

MapReduce数据集计算

2021-10-23 09:32:07

办公

2019-05-21 21:36:42

Python编程语言游戏

2011-10-18 14:00:30

MapReduce分布式流式

2017-06-05 11:03:07

Linuxshutdown命令

2020-08-05 19:01:57

谷歌代码开发者

2011-04-27 10:11:58

耗材用户体验

2017-04-19 11:17:48

SparkHadoopMapReduce
点赞
收藏

51CTO技术栈公众号