文档章节

向你老婆解释清楚MapReduce

做人当本然
 做人当本然
发布于 2017/05/09 10:51
字数 844
阅读 1
收藏 0

本文转自「开发者圆桌」一个10年老猿原创文章传播开发经验,尤其适合初学者或刚入职场前几年程序猿的微信公众号。

干巴巴的定义

 

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

 

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

 

形象的解释1:统计图书

 

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

 

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

 

形象的解释2:统计图形

 

 

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

 

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

 

说了那么多,你老婆可能已经理解了MR,但是你可能还无法和程序代码联系起来,下面的这个小例子可以帮助到你,类似的样例网上很多,去搜索吧,这里简单分析一下关键代码,通过标注的nameText 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这东西实在太简单了,否则说明你还没有成功运行过第一个小程序。实践!实践!实践!

© 著作权归作者所有

做人当本然
粉丝 0
博文 11
码字总数 12300
作品 0
东城
高级程序员
私信 提问
2014-11-12--Hadoop的基础学习(三)--Hadoop中MapReduce框架入门

1.MapReduce的简单概念 百度百科:MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)",和他们的主要思想,都是从函数式编程语言里借来的...

查封炉台
2014/11/16
8.3K
8
国内最全最详细的hadoop2.2.0集群的MapReduce的最简单配置

简介 hadoop2的中的MapReduce不再是hadoop1中的结构已经没有了JobTracker,而是分解成ResourceManager和ApplicationMaster。这次大变革被称为MRv2或者YARN,是一次革命性的变化。 配置 在前面...

吴超沉思录
2014/01/26
276
0
MapReduce: 一个巨大的倒退

前言 databasecolumn 的数据库大牛们(其中包括PostgreSQL的最初伯克利领导:Michael Stonebraker)最近写了一篇评论当前如日中天的MapReduce技术的文章,引发剧烈的讨论。我抽空在这儿翻译一...

ddatsh
2011/11/04
4.5K
7
【Hadoop】- MapReduce 代码工作过程

Hadoop MapReduce基础案例 MapReduce:Hadoop分布式并行计算框架 思想:分治法 通俗解释 工厂给客户交付货物1000吨,卡车A运量50吨,需要顺序20次,如果平时客户不忙20次运输所需的时间客户能...

ZeroneLove
02/24
6
0
如何向妻子解释 hadoop 中的 mapreduce

印度 Java 程序员 Shekhar Gulati 在自己的博客发表了 “How I explained MapReduce to my Wife?” 一文,比较通俗地阐述了 MapReduce 的概念。 昨天,我在 Xebia 印度办公室发表了一个关于 ...

justjavac
2013/09/17
1K
7

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
昨天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
昨天
28
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
昨天
65
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
昨天
58
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
昨天
60
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部