MapReduce是一种云计算的核心计算模式,是一种分布式运算技术,也是简化的分布式并行编程模式,主要用于大规模并行程序并行问题。

MapReduce的主要思想:自动将一个大的计算(程序)拆分成Map(映射)和Reduce(化简)的方式。

流程图如下:

数据被分割后通过Map函数将数据映射成不同的区块,分配给计算集群进行处理,以达到分布运算的效果,再通过Reduce函数将结果进行汇整,从而输出开发者所需要的结果。

MapReduce借鉴了函数式程序设计语言的思想,其软件实现是指定一个Map函数,把键值对(Key/Value)映射成一个新的键值对(Key/Value),形成一系列中间结果形式的(Key/Value),然后把它们传递给Reduce函数,把具有相同中间形式Key的Value合并在一起。Map函数和Reduce函数具有一定的关联性。

接下来从Shuffler来详细描述Map和Reduce的细节

 Shuffler就是reduce从map拉取数据的过程。(说的形象一点就是:将数据重新打乱汇聚到不同节点的过程,当然相同key需要汇聚在同一个节点)

以WordCount为例,假设有8个MapTask和3个ReduceTask

Map端整个流程分为4步:

(1)在MapTask执行时,其输入数据来源于HDFS的Block。Split和Block默认对应关系是一对一。在WordCount例子中,假设Map的输入数据都是像“aaa”这样的字符串。

(2)在经过Mapper运行后,输出是这样一个Key/Value对:Key是“aaa”,Value是1。我们知道这个Job有3个ReduceTask,到底“aaa”应该交由哪个Reducer去处理,是需要现在决定的。MapReduce提供了Partitioner接口,其作用是根据Key或Value及Reduce的数量来决定当前这对输出数据最终应该交由哪个ReduceTask处理。默认对Key进行哈希运算后,再以ReduceTask数量取模。在该例中,“aaa”经过Partition(分区)后返回0,也就是这对输出数据应当由第一个Reducer来处理。接下来需要将数据写入内存缓冲区中。缓冲区的作用就是批量收集Map结果,减少磁盘I/O影响。

(3)内存缓冲区的大小是有限的,默认是100MB。当MapTask输出结果有很多时,内存可能会不足,所以需要在一定条件下将缓冲区中的数据临时写入磁盘,然后重新利用这个缓冲区。这个从内存往磁盘写数据的过程被称为Spill,中文译为溢写。

(4)每一次溢写都会在磁盘上生成一个溢写文件,如果Map输入结果很大,就会有多次这样的溢写发生,磁盘上就会有多个溢写文件存在。当MapTask真正完成时,内存缓冲区中的数据将全部溢写到磁盘中形成一个溢写文件。最终磁盘中会至少有这样的一个溢写文件存在(如果Map的输出结果很少(小于100MB),那么当Map执行完成时,只会产生一个溢写文件)。因为最终的文件只有一个,所以需要将这些溢写文件归并(使用归并算法)到一起,这个过程就是Merge。至此,Map端所有工作都已结束。

每个ReduceTask不断地通过RPC(HTTP协议)从JobTracker(Hadoop2.0有了Yarn之后,是ResourceManager)那里获取MapTask是否完成信息。如果ReduceTask获知某台TaskTraker(Hadoop2.x中为AppMaster)上的MapTask执行完成,那么Shuffler的后半段过程开始启动。简单地说,ReduceTask在执行之前的工作就是不断地拉取当前Job里的每个MapTask的最终结果,然后对不同地方拉取过来的数据不断地进行Merge,最终形成一个文件作为ReduceTask的输入文件。

 Reduce端整个流程分为3步:

(1)Copy过程。即简单地拉取数据。Reduce进程启动一些数据copy线程(Fetcher),通过HTTP方式请求MapTask所在的TaskTracker获取MapTask的输出文件。因为MapTask早已结束,所以这些文件就由TaskTracker管理。

(2)Merge阶段。同Map端的Merge动作,只是数组中存放的是不同Map端复制过来的数据。复制过来 数据会先放到内存缓冲区中,当内存中的数据达到一定阈值时,就会启动内存到磁盘的Merge。与Map端类似,这也是溢写过程,会在磁盘中形成众多的溢写文件,然后将这些溢写文件进行归并。

(3)Reducer的输出文件。不断地进行Merge后,最后会生成一个“最终文件”。这个文件可能存放在磁盘,也可能存放在内存中,默认存放在磁盘上。当Reducer的输入文件已定时,整个Shuffle过程才最终结束。

这里给出一个宏观的流程图:

总结:

map每次读取split的数据(一行一行的读取)后先放在buffer缓冲区中,然后进行分区、排序、当缓冲区满了之后,会进行溢写磁盘。磁盘中会生成很多个溢写小文件,而这些小文件内部是有序的,但小文件和小文件之间是无序的,所以需要进行一次归并形成一个全盘有序的文件。

 由于一个split对应一个map,reduce端是从多个map中拉取数据,所以也需要进行归并为一个有序的文件,最终每个相同的key分为一组执行一次reduce方法。

MapReduce过程详解相关推荐

  1. MapReduce过程详解及其性能优化

    http://blog.csdn.net/aijiudu/article/details/72353510 废话不说直接来一张图如下: 从JVM的角度看Map和Reduce Map阶段包括: 第一读数 ...

  2. Hadoop学习之Mapreduce执行过程详解

    一.MapReduce执行过程 MapReduce运行时,首先通过Map读取HDFS中的数据,然后经过拆分,将每个文件中的每行数据分拆成键值对,最后输出作为Reduce的输入,大体执行流程如下图所示: ...

  3. MapReduce:Shuffle过程详解

    MapReduce:Shuffle过程详解 1.Map任务处理 1.1 读取HDFS中的文件.每一行解析成一个<k,v>.每一个键值对调用一次map函数.                & ...

  4. hadoop作业初始化过程详解(源码分析第三篇)

    (一)概述 我们在上一篇blog已经详细的分析了一个作业从用户输入提交命令到到达JobTracker之前的各个过程.在作业到达JobTracker之后初始化之前,JobTracker会通过submit ...

  5. 简历项目描述过程详解

    简历项目描述过程详解 一.项目分点 1.1 集群规模 1.2 框架结构,画出来 1.3 框架 1.3.1 第一个Flume 1.3.1.1 碰到的问题 1.3.2 kafka 1.3.2.1 框架介绍 ...

  6. Shuffle过程详解

    Shuffle过程详解 Shuffle过程是MapReduce的核心,最近看了很多资料,网上说法大体相同,但有些地方有一点点出入,就是各个阶段的执行顺序 总个shuffle过程可以看做是从map输出到 ...

  7. python的执行过程_在交互式环境中执行Python程序过程详解

    前言 相信接触过Python的伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同的操作平台上还互不相同.今天,小编讲些Py ...

  8. 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  9. JetBrains DataGrip工具配置数据库过程详解

    JetBrains DataGrip工具配置数据库过程详解 DataGrip是一款数据库管理客户端工具,方便连接到数据库服务器,执行sql.创建表.创建索引以及导出数据等. DataGrip 是 Je ...

最新文章

  1. 科学解析2021年AI领域的10个大胆预测
  2. java中isolate时间_flutter/dart里面,一个isolate一般heap多大?
  3. 引用第三方高德地图接口---使用js脚本进行开发地图定位的步骤
  4. understanding the Euler Lagrange equation
  5. C++11 继承构造函数与委托构造函数
  6. atitit.避免NullPointerException 总结and 最佳实践 o99
  7. 教你正确说话的6个玄机
  8. 网页游戏服务器的源代码武者无敌_仅百元搭建盗版游戏框架,牟利上百万元……私服游戏地下产业链的“生意经”...
  9. ClearCase截取
  10. 西安电子科技大学计算机学院保研政策,西安电子科技大学计算机学院(专业学位)计算机技术保研条件...
  11. socket 10106问题解决日记
  12. thinkPHP中{$Think }用法
  13. uniapp登陆页面功能
  14. 序列模型与注意力机制总结
  15. 面试官:线上环境 FGC 频繁,如何解决?
  16. 嵌入式智能家居项目视频监控_智能化您的视频嵌入
  17. 热烈庆祝下Air2.0版Rock506Dock beta1.0上线~
  18. unity删除云端项目
  19. Mac苹果电脑调整磁盘区域大小
  20. Python数据分析案例10——北向资金流入与沪深300涨跌幅分析

热门文章

  1. (转)关于Android中为什么主线程不会因为Looper.loop()里的死循环卡死?引发的思考,事实可能不是一个 epoll 那么 简单。...
  2. C#调用exe工作目录
  3. 自制Dede网站地图的秘诀
  4. ASP.net AJAX 调用PageMethods实例
  5. python3 _笨方法学Python_日记_DAY4
  6. MySql表里数据的限制
  7. 使用MDT2012部署WindowsLinux操作系统(4)
  8. flex4 权威指南 part01
  9. 时刻记住要做合格的程序员——一次高性能程序设计实验课后的反思
  10. Mac上安装homebrew(类似于Linux上的apt-get)