MapReduce 过程详解 (用WordCount作为例子)

本文转自 http://www.cnblogs.com/npumenglei/

....

先创建两个文本文件, 作为我们例子的输入:

File 1 内容:

My name is Tony

My company is pivotal

File 2 内容:

My name is Lisa

My company is EMC

1. 第一步, Map

顾名思义, Map 就是拆解.

首先我们的输入就是两个文件, 默认情况下就是两个split, 对应前面图中的split 0, split 1

两个split 默认会分给两个Mapper来处理, WordCount例子相当地暴力, 这一步里面就是直接把文件内容分解为单词和 1 (注意, 不是具体数量, 就是数字1)其中的单词就是我们的主健,也称为Key, 后面的数字就是对应的值,也称为value.

那么对应两个Mapper的输出就是:

split 0

My       1

name    1

is         1

Tony     1

My          1

company     1

is       1

Pivotal   1

split 1

My       1

name    1

is       1

Lisa     1

My       1

company  1

is       1

EMC     1

2. Partition

Partition 是什么? Partition 就是分区。

为什么要分区? 因为有时候会有多个Reducer, Partition就是提前对输入进行处理, 根据将来的Reducer进行分区. 到时候Reducer处理的时候, 只需要处理分给自己的数据就可以了。

如何分区? 主要的分区方法就是按照Key 的不同,把数据分开,其中很重要的一点就是要保证Key的唯一性, 因为将来做Reduce的时候有可能是在不同的节点上做的, 如果一个Key同时存在于两个节点上, Reduce的结果就会出问题, 所以很常见的Partition方法就是哈希。

结合我们的例子, 我们这里假设有两个Reducer, 前面两个split 做完Partition的结果就会如下:

split 0

Partition 1:
company 1
is      1
is    1

Partition 2:
My     1
My    1
name  1
Pivotal   1
Tony    1

split 1

Partition 1:
company 1
is    1

is      1
EMC   1

Partition 2:
My     1
My       1
name   1
Lisa     1

其中Partition 1 将来是准备给Reducer 1 处理的, Partition 2 是给Reducer 2 的

这里我们可以看到, Partition 只是把所有的条目按照Key 分了一下区, 没有其他任何处理, 每个区里面的Key 都不会出现在另外一个区里面。

3. Sort

Sort 就是排序喽, 其实这个过程在我来看并不是必须的, 完全可以交给客户自己的程序来处理。 那为什么还要排序呢? 可能是写MapReduce的大牛们想,“大部分reduce 程序应该都希望输入的是已经按Key排序好的数据, 如果是这样, 那我们就干脆顺手帮你做掉啦, 请叫我雷锋!”  ......好吧, 你是雷锋.

那么我们假设对前面的数据再进行排序, 结果如下:

split 0

Partition 1:
company 1
is      1
is    1

Partition 2:
My     1
My    1
name  1
Pivotal   1
Tony    1

split 1

Partition 1:
company 1
EMC   1
is    1

is      1

Partition 2:
Lisa   1
My     1
My       1
name   1

这里可以看到, 每个partition里面的条目都按照Key的顺序做了排序

4. Combine

什么是Combine呢? Combine 其实可以理解为一个mini Reduce 过程, 它发生在前面Map的输出结果之后, 目的就是在结果送到Reducer之前先对其进行一次计算, 以减少文件的大小, 方便后面的传输。 但这步也不是必须的。

按照前面的输出, 执行Combine:

split 0

Partition 1:
company 1
is      2

Partition 2:
My     2
name  1
Pivotal   1
Tony    1

split 1

Partition 1:
company 1
EMC   1
is    2

Partition 2:
Lisa   1
My     2
name   1

我们可以看到, 针对前面的输出结果, 我们已经局部地统计了is 和My的出现频率, 减少了输出文件的大小。

5. Copy

下面就要准备把输出结果传送给Reducer了。 这个阶段被称为Copy, 但事实上雷子认为叫他Download更为合适, 因为实现的时候, 是通过http的方式, 由Reducer节点向各个mapper节点下载属于自己分区的数据。

那么根据前面的Partition, 下载完的结果如下:

Reducer 节点 1 共包含两个文件:

Partition 1:
company 1
is      2

Partition 1:

company  1

EMC    1

is    2

Reducer 节点 2 也是两个文件:

Partition 2:

My     2
name  1
Pivotal   1
Tony    1

Partition 2:

Lisa   1

My     2

name   1

这里可以看到, 通过Copy, 相同Partition 的数据落到了同一个节点上。

6. Merge

如上一步所示, 此时Reducer得到的文件是从不同Mapper那里下载到的, 需要对他们进行合并为一个文件, 所以下面这一步就是Merge, 结果如下:

Reducer 节点 1

company 1
company  1
EMC    1

is      2
is    2

Reducer 节点 2

Lisa  1
My     2
My    2

name  1
name  1

Pivotal   1

Tony    1

7. Reduce

终于可以进行最后的Reduce 啦...这步相当简单喽, 根据每个文件中的内容最后做一次统计, 结果如下:

Reducer 节点 1

company 2
EMC    1

is      4

Reducer 节点 2

Lisa  1
My     4

name  2

Pivotal   1

Tony    1

至此大功告成! 我们成功统计出两个文件里面每个单词的数目, 同时把它们存入到两个输出文件中, 这两个输出文件也就是传说中的 part-r-00000 和 part-r-00001, 看看两个文件的内容, 再回头想想最开始的Partition, 应该是清楚了其中的奥秘吧。

如果你在你自己的环境中运行的WordCount只有part-r-00000一个文件的话, 那应该是因为你使用的是默认设置, 默认一个job只有一个reducer

如果你想设两个, 你可以:

1. 在源代码中加入  job.setNumReduceTasks(2), 设置这个job的Reducer为两个
或者
2. 在 mapred-site.xml 中设置下面参数并重启服务
<property>
  <name>mapred.reduce.tasks</name>
  <value>2</value>
</property>

这样, 整个集群都会默认使用两个Reducer

结束语:

本文大致描述了一下MapReduce的整个过程以及每个阶段所作的事情, 并没有涉及具体的job,resource的管理和控制, 因为那个是第一代MapReduce框架和Yarn框架的主要区别。 而两代框架中上述MapReduce 的原理是差不多的,希望对大家有所帮助。

时间: 2024-10-11 08:14:55

MapReduce 过程详解 (用WordCount作为例子)的相关文章

Hadoop MapReduce执行过程详解(带hadoop例子)

https://my.oschina.net/itblog/blog/275294 摘要: 本文通过一个例子,详细介绍Hadoop 的 MapReduce过程. 分析MapReduce执行过程 MapReduce运行的时候,会通过Mapper运行的任务读取HDFS中的数据文件,然后调用自己的方法,处理数据,最后输出.Reducer任务会接收Mapper任务输出的数据,作为自己的输入数据,调用自己的方法,最后输出到HDFS的文件中.整个流程如图: Mapper任务的执行过程详解 每个Mapper任

MapReduce过程详解

Hadoop越来越火,围绕Hadoop的子项目更是增长迅速,光Apache官网上列出来的就十几个,但是万变不离其宗,大部分项目都是基于Hadoop Common. MapReduce更是核心中的核心.那么到底什么是MapReduce,它具体是怎么工作的呢? 关于它的原理,说简单也简单,随便画个图喷一下Map和Reduce两个阶段似乎就完了.但其实这里面还包含了很多的子阶段,尤其是Shuffle,很多资料里都把它称为MapReduce的“心脏”,和所谓“奇迹发生的地方”.真正能说清楚其中关系的人就

Hadoop学习之MapReduce执行过程详解

转自:http://my.oschina.net/itblog/blog/275294 分析MapReduce执行过程 MapReduce运行的时候,会通过Mapper运行的任务读取HDFS中的数据文件,然后调用自己的方法,处理数据,最后输出.Reducer任务会接收Mapper任务输出的数据,作为自己的输入数据,调用自己的方法,最后输出到HDFS的文件中.整个流程如图: Mapper任务的执行过程详解 每个Mapper任务是一个java进程,它会读取HDFS中的文件,解析成很多的键值对,经过我

MapReduce阶段源码分析以及shuffle过程详解

MapReducer工作流程图: 1. MapReduce阶段源码分析 1)客户端提交源码分析 解释:   - 判断是否打印日志   - 判断是否使用新的API,检查连接   - 在检查连接时,检查输入输出路径,计算切片,将jar.配置文件复制到HDFS   - 计算切片时,计算最小切片数(默认为1,可自定义)和最大切片数(默认是long的最大值,可以自定义)   - 查看给定的是否是文件,如果是否目录计算目录下所有文件的切片   - 通过block大小和最小切片数.最大切片数计算出切片大小  

hadoop 学习笔记:mapreduce框架详解

hadoop 学习笔记:mapreduce框架详解 开始聊mapreduce,mapreduce是hadoop的计算框架,我 学hadoop是从hive开始入手,再到hdfs,当我学习hdfs时候,就感觉到hdfs和mapreduce关系的紧密.这个可能是我做技术研究的 思路有关,我开始学习某一套技术总是想着这套技术到底能干什么,只有当我真正理解了这套技术解决了什么问题时候,我后续的学习就能逐步的加快,而学习 hdfs时候我就发现,要理解hadoop框架的意义,hdfs和mapreduce是密不

[转载] Android签名机制之—签名过程详解

本文转载自: http://www.wjdiankong.cn/android%E7%AD%BE%E5%90%8D%E6%9C%BA%E5%88%B6%E4%B9%8B-%E7%AD%BE%E5%90%8D%E8%BF%87%E7%A8%8B%E8%AF%A6%E8%A7%A3/ 一.前言 又是过了好长时间,没写文章的双手都有点难受了.今天是圣诞节,还是得上班.因为前几天有一个之前的同事,在申请微信SDK的时候,遇到签名的问题,问了我一下,结果把我难倒了..我说Android中的签名大家都会熟悉

Android签名机制之---签名过程详解

一.前言 又是过了好长时间,没写文章的双手都有点难受了.今天是圣诞节,还是得上班.因为前几天有一个之前的同事,在申请微信SDK的时候,遇到签名的问题,问了我一下,结果把我难倒了..我说Android中的签名大家都会熟悉的,就是为了安全,不让别人修改你的apk,但是我们真正的有了解多少呢?所以准备两篇文章好好介绍一下Android中签名机制. 在说道Android签名之前,我们需要了解的几个知识点 1.数据摘要(数据指纹).签名文件,证书文件 2.jarsign工具签名和signapk工具签名 3

Java 序列化Serializable详解(附详细例子)

1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程. 2.什么情况下需要序列化  a)当你想把的内存中的对象保存到一个文件中或者数据库中时候: b)当你想用套接字在网络上传送对象的时候: c)当你想通过RMI传输对象的时候: 3.如何实现序列化 将需要序列化的类实现Serializable接口就可以了,Serializable接口中没有任何方法,可以理解为一个标记,即表明

nagios配置过程详解

一.nagios配置过程详解 1.nagios默认配置文件介绍 nagios安装完毕后,默认的配置文件在/usr/local/nagios/etc目录下,每个文件或目录含义如下表所示: 2.配置文件之间的关系 在nagios的配置过程中涉及到的几个定义有:主机.主机组,服务.服务组,联系人.联系人组,监控时间,监控命令等,从这些定义可以看出,nagios各个配置文件之间是互为关联,彼此引用的. 成功配置出一台nagios监控系统,必须要弄清楚每个配置文件之间依赖与被依赖的关系,最重要的有四点: