MapReduce运行流程分析
研究MapReduce已经有一段时间了。起初是从分析WordCount程序开始,后来开始阅读Hadoop源码,自认为已经看清MapReduce的运行流程。现在把自己的理解贴出来,与大家分享,欢迎纠错。
还是以最经典的WordCount程序作为基础,来分析map阶段、reduce阶段和最复杂的shuffle阶段。
文本1:hello world 文本2:map reduce
hello hadoop java interface
abc qaz java hdfs
java jvm spark storm
这样的2个小文本文件(不足64M),肯定会产生2个map任务,reduce任务默认是1个。当然,map任务和reduce任务的个数都可以在程序中或者配置文件中人为设置。为了说明partition的过程,我们把reduce任务的个数设为2。
1、map阶段
map1 map2
输入:<xxxx, hello world> <xxxx, map reduce>
<xxxx, hello hadoop> <xxxx, java interface>
<xxxx, abc qaz> <xxxx, java hdfs>
<xxxx, java jvm> <xxxx, spark storm>
切分:<hello, 1> <map, 1>
<word, 1> <reduce, 1>
<hello, 1> <java, 1>
<hadoop, 1> <interface, 1>
<abc, 1> <java, 1>
<qaz, 1> <hdfs, 1>
<java, 1> <spark, 1>
<jvm, 1> <storm, 1>
2、shuffle阶段
切分完毕后,每一组<key, value>都会不断地被collect到一个内存缓冲区中,对应代码中的数据结构MapOutputBuffer。
partition过程:每一组<key, value>在被收集的时候,就已经确定了分区(partition),即在这个时候就已经确定了要交给哪个reduce任务处理。分区会给<key, value>加上一个索引标识。假设分区后(分区算法可以设定,默认是hash值模运算),数据如下:reduce1的标识是0,reduce2的标识是1
<hello, 1> 0 <map, 1> 0
<word, 1> 1 <reduce, 1> 1
<hello, 1> 0 <java, 1> 0
<hadoop, 1> 1 <interface, 1> 1
<abc, 1> 0 <java, 1> 0
<qaz, 1> 1 <hdfs, 1> 1
<java, 1> 0 <spark, 1> 0
<jvm, 1> 1 <storm, 1> 1
spill过程:缓冲区默认是100M,每当里面的数据达到80M(比例80%,这个比例也可以人为设置),就会另起一个线程SpillThread往磁盘溢写,每次溢写都会产生一个数据文件和对应的索引文件。
sort过程:在溢写的过程中一直在排序,比较算法可以定制,默认排序算法是快速排序(可以人为设定),排序的过程就是一些位置的索引在不断的变化。
排序之后的数据:
<abc, 1> 0 <hdfs, 1> 1
<hello, 1> 0 <interface, 1> 1
<hello, 1> 0 <java, 1> 0
<hadoop, 1> 1 <java, 1> 0
<java, 1> 0 <map, 1> 0
<jvm, 1> 1 <reduce, 1> 1
<qaz, 1> 1 <spark, 1> 0
<word, 1> 1 <storm, 1> 1
combine过程:这个过程默认是没有的,需要明确指定combiner。combiner其实就是一个reducer,可以让数据交给reduce任务之前,进行一些计算、合并。它的意义在于,使数据进一步减少,减轻了 reduce任务通过网络获取数据的压力和reduce处理数据的压力。combiner也可以自己定制,每个溢写文件都会combine。
combiner会通过一个比较器对key进行比较,相同的key(比较结果为0,比较算法可以定制),会被放到一个集合的迭代器中,然后迭代进行一次reduce运算,产生一个输出。
combine之后的数据:
<abc, 1> 0 <hdfs, 1> 1
<hello, 1+1> 0 <interface, 1> 1
<hadoop, 1> 1 <java, 1+1> 0
<java, 1> 0 <map, 1> 0
<jvm, 1> 1 <reduce, 1> 1
<qaz, 1> 1 <spark, 1> 0
<word, 1> 1 <storm, 1> 1
merge过程:一个map所有的溢写文件都会进行合并,产生一个最终的溢写文件和一个索引文件。合并是针对于不同的溢写文件中相同分区的数据。在这个合并的过程中,也会进行combine操作(如果设置了的话),此处的combine过程同上,不再细说。
copy数据过程:每个reduce任务会远程copy属于自己的多个map输出数据文件,通过http传输,在本地会合并。另外,这个过程也会进行combine,此次不过多说明。
结果如下:
reduce0 reduce1
<abc, 1> <hadoop, 1>
<hello, 2> <jvm, 1>
<java, 1> <qaz, 1>
<java, 2> <word, 1>
<map, 1> <hdfs, 1>
<spark, 1> <interface, 1>
<reduce, 1>
<storm, 1>
sort过程:对上述结果进行排序,结果如下:
reduce0 reduce1
<abc, 1> <hadoop, 1>
<hello, 2> <hdfs, 1>
<java, 1> <interface, 1>
<java, 2> <jvm, 1>
<map, 1> <qaz, 1>
<spark, 1> <reduce, 1>
<storm, 1>
<word, 1>
3、reduce阶段
通过一个GroupComparator对key进行比较,相同的key(比较结果为0,比较算法可以定制),会被放到一个集合的迭代器中,然后迭代进行一次reduce运算,产生一个输出。类似combine过程。
最终的输出: reduce0 reduce1
<abc, 1> <hadoop, 1>
<hello, 2> <hdfs, 1>
<java, 3> <interface, 1>
<map, 1> <jvm, 1>
<spark, 1> <qaz, 1>
<reduce, 1>
<storm, 1>
<word, 1>
从上述过程的分析可以看出,合并和排序是核心!!!
PS:其实每个阶段没有这么分明,只不过是为了分析和理解的需要,才进行这样详细的划分,而且划分的还不一定正确,请大家及时纠错。另外,上述流程中涉及到好多的细节,没有一一说明。
MapReduce运行流程分析的更多相关文章
- Struts2运行流程分析
一.Struts2运行流程图: 二.运行流程分析: 1. 请求发送给StrutsPrepareAndExecuteFilter 2.StrutsPrepareAndExecuteFilter询问Act ...
- 011-Spring Boot 运行流程分析SpringApplication.run
一.程序入口 1.1.静态方法 //直接调用run方法 ConfigurableApplicationContext context = SpringApplication.run(App.class ...
- 【逆向&编程实战】Metasploit安卓载荷运行流程分析_复现meterpreter模块接管shell
/QQ:3496925334 作者:MG193.7 CNBLOG博客号:ALDYS4 未经许可,禁止转载/ 关于metasploit的安卓模块,前几次的博客我已经写了相应的分析和工具 [Android ...
- hadoop运行流程分析源代码级
前言: 最近一直在分析hadoop的运行流程,我们查阅了大量的资料,虽然从感性上对这个流程有了一个认识但是我总是感觉对mapreduce的运行还是没有一个全面的认识,所以决定从源代码级别对mapred ...
- thttpd和cgilua安装与运行流程分析
安装 参考如下博文安装thttpd软件 http://blog.csdn.net/21aspnet/article/details/7045845 http://blog.csdn.net/drago ...
- springmvc的运行流程分析
前几篇文章对springmvc讲解的很清楚,大家看下,有问题,我们再一起讨论. 其实springmvc最为重要是它的运行流程,接着,我们来分析一下,其运行过程,废话不多说,看图说话: 分析如下: 1, ...
- SparkSteaming运行流程分析以及CheckPoint操作
本文主要通过源码来了解SparkStreaming程序从任务生成到任务完成整个执行流程以及中间伴随的checkpoint操作 注:下面源码只贴出跟分析内容有关的代码,其他省略 1 分析流程 应用程序入 ...
- 8、Struts2 运行流程分析
1.流程分析: 请求发送给 StrutsPrepareAndExecuteFilter StrutsPrepareAndExecuteFilter 询问 ActionMapper: 该请求是否是一个 ...
- yii框架详解 之 CWebApplication 运行流程分析
在 程序入口处,index.php 用一句 Yii::createWebApplication($config)->run(); 开始了app的运行. 那么,首先查看 CWebApplicat ...
随机推荐
- VB6/VBA中跟踪鼠标移出窗体控件事件(类模块成员函数指针CHooker类应用)
一.关于起因 前几天发了一篇博文,是关于获取VB类模块成员函数指针的内容(http://www.cnblogs.com/alexywt/p/5880993.html):今天我就发一下我的应用实例. V ...
- VS 2017开发ASP.NET Core Web应用过程中发现的一个重大Bug
今天试着用VS 2017去开发一个.net core项目,想着看看.net core的开发和MVC5开发有什么区别,然后从中发现了一个VS2017的Bug. 首先,我们新建项目,ASP.NET Cor ...
- Android 开发之错误整理 [2014-04-28 09:22:28 - XXXX] Unable to resolve target 'android-18'
在开发的时候难免会导入项目,那么怎么经常会遇到这个错误: [2014-04-28 09:22:28 - XXXX] Unable to resolve target 'android-18' targ ...
- 读书笔记 effective c++ Item 44 将与模板参数无关的代码抽离出来
1. 使用模板可能导致代码膨胀 使用模板是节省时间和避免代码重用的很好的方法.你不需要手动输入20个相同的类名,每个类有15个成员函数,相反,你只需要输入一个类模板,然后让编译器来为你实例化20个特定 ...
- Mybatis基础学习(五)—缓存
一.概述 mybatis提供查询缓存,如果缓存中有数据就不用从数据库中获取,用于减轻数据压力,提高系统性能. 一级缓存是SqlSession级别的缓存.在操作数据库时需要 ...
- 微信小程序省市联动
最近呢刚好做了一个省市联动的功能,今天看到有人问这个怎么做,我就把我做的放上来共享一下: 首先呢,来看看效果,点击文字'点击',弹出选择窗口,点击取消或者确定(取消.确定按钮在选择框上边,截图有些不清 ...
- [转载]转载一篇好文章作为Java与面向对象之随感(3)
关于对象与引用之间的一些基本概念. 初学Java时,在很长一段时间里,总觉得基本概念很模糊.后来才知道,在许多Java书中,把对象和对象的引用混为一谈.可是,如果我分不清对象与对象引用, 那实在没法很 ...
- C++ fstream 详解
最近在写哈夫曼压缩,遇到了一个比较让人头疼的问题,那就是对文件的读写操作,尤其是以二进制的形式来读写,无奈C++Primer第五版上写的并不详细,很多让人困惑的地方没有涉及或者没有讲清楚.于是这几天我 ...
- Node.js系列:Buffer类的使用
客户端JavaScript中没有对二进制数据提供很好的支持.但是在处理TCP流或文件流时,必须要处理二进制数据.Node.js定义了一个Buffer类,用来创建一个专门存放二进制数据的缓存区. Buf ...
- 【转载】google搜索从入门到精通
原文地址:http://www.cnblogs.com/helloIT/articles/5095668.html /***************************************** ...