MapReduce是Hadoop2.x的一个计算框架,利用分治的思想,将一个计算量很大的作业分给很多个任务,每个任务完成其中的一小部分,然后再将结果合并到一起。将任务分开处理的过程为map阶段,将每个小任务的结果合并到一起的过程为reduce阶段。下面先从宏观上介绍一下客户端提交一个作业时,Hadoop2.x各个组件之间的联系及处理流程。然后我们再具体看看MapReduce计算框架在执行一个作业时,做了些什么。

YARN

YARN是Hadoop2.x框架下的资源管理系统,其组成部分为:

1)全局资源管理器(global resource manager):整个系统的资源管理和调配。

2)节点管理器(node manager)(每个节点都有一个)负责任务的启动、配置及其资源的监控

3)针对每个应用程序的应用程序管理器(application-specific application master)(因为Hadoop2.x支持的计算框架有很多,不只是MapReduce,还有像storm、spark、Tez不同处理机制的计算框架,所以MapReduce是一种应用程序,每个MapReduce作业是MapReduce类型程序的一个实例)

4)调度器(scheduler)(在资源管理器里)

5)容器(container):一部分CPU和内存组成一个容器,最为资源使用,一个应用程序运行在一组容器中。

在了解了各个组件的功能之后,借助下图,我们看一下提交一个作业的流程:

  

1)客户端向资源管理器提交作业程序,作业程序的类型决定了使用哪种应用程序管理器(MapReduce、storm、Tez...)

2)资源管理器协调资源,在一个节点上获取一个运行应用程序管理器实例的容器

3)应用程序管理器(application master)在资源管理器中注册

4)应用程序管理器通过资源请求与资源管理器协商资源,包括该容器所在的节点和该容器的详细说明(CPU核数量和内存大小)

5)和 6)应用程序管理器在一个节点上或者多个节点上运行其Map Task和Reduce Task

7)在容器中运行的应用程序向应用程序管理器汇报执行度

8)应用程序执行完毕,应用程序管理器就会从资源管理器中取消注册,作业占用的资源会释放到系统中

MapReduce计算框架

MapReduce总的可以分为map阶段、shuffle阶段和reduce阶段。

map阶段

1)从HDFS中将输入值传输到Mapper节点

除了传输之外,在读取过程中,还需要做一个转换过程,将数据转换为键值对的形式(MapReduce处理的输入必须为键值对的形式),这个过程通过InputFormat完成(默认为TextInputFormat

2)Mapper

根据自己写的Mapper函数对文件进行处理,同样输出的是键值对(如wordcount中统计收到的数据中每个词出现的次数)

3)Partitioner

Patitioner根据Reducer的数量和自定义的划分方法(没有自定义的话,Hadoop有默认实现)去划分Mapper的输出;划分的结果会按照Mapper输出的键进行排序。

4)Combiner(这一步是可选的)

经过Partitioner排序后,如果作业中配置了Combiner,就会调用Combiner,Combiner就好像在Mapper端提前进行一下Reducer一样。

那为什么要提前进行呢?这是为了尽量减少对网络带宽的需求,比如经典的wordcount程序,在Mapper端处理之后,我们可能得到一个像key = apple,value = {1,1,1,1,1,1}的结果,如果我们能先对其进行一下Combiner,那么就能得到key = apple,value = 6的结果,传输这样的数据,肯定是要比key = apple,value = {1,1,1,1,1,1}的数据节省带宽的。

那既然能够节省传输带宽,为什么又是可选的呢?何不每次都默认执行Combiner?这是因为并不是每一个Mapper都能进行Combiner;比如现在我们的任务要统计一段时间内的每天的最高气温,假设开始有两个Mapper,输出为(0,10,20)和(15,25),那么提前进行Combiner可以使得传递给Reducer端的数据为(20, 25)这样最后的结果还是为25,且传输的数据量变小;但是假如我们要求一段时间内的平均温度呢?如果开始就在Mapper端进行Combiner求平均温度,那么Reducer端得到的数据为(10, 20),算出的平均温度为15,但是实际上的平均温度为(0, 10, 20 , 15 ,25)的平均,为14;所以需要搞清楚Combiner合适不合适提前进行。

shuffle阶段

shuffle阶段要做的事就是保证Mapper输出的数据传输到合适的Reducer进行处理,如下图所示:

shuffle阶段,每个Reducer都会使用HTTP协议从Mapper节点获得自己的划分(Reducer通过Application Master来获取自己应该查询哪些Mapper节点来获取自己划分的信息,因为每个Mapper实例完成后,会通知Application Master运行阶段产生的划分)

reduce阶段

1)Reducer

根据自己写的reduce程序对数据进行处理(如wordcount中将每个单词出现的次数加起来得到总和)

2)将处理结果输出到HDFS

通过OutputFormat完成(默认是TextOutputFormat

总结

通过对Hadoop2.x框架的处理流程和MapReduce计算框架的处理流程的梳理,可以在进行程序编写时有一个更清楚的认识,下一步应该具体做些什么。

参考:《Hadoop权威指南》

    《Hadoop技术内幕》

MapReduce处理流程的更多相关文章

  1. MapReduce基本流程与设计思想初步

    1.MapReduce是什么? MapReduce是一种编程模型,用于大规模数据集的并行运算.它借用了函数式的编程概念,是Google发明的一种数据处理模型. 主要思想为:Map(映射)和Reduce ...

  2. MapReduce工作流程及Shuffle原理概述

    引言: 虽然MapReduce计算框架简化了分布式程序设计,将所有的并行程序均需要关注的设计细节抽象成公共模块并交由系统实现,用户只需关注自己的应用程序的逻辑实现,提高了开发效率,但是开发如果对Map ...

  3. mapreduce执行流程

    角色描述:JobClient:执行任务的客户端JobTracker:任务调度器TaskTracker:任务跟踪器Task:具体的任务(Map OR Reduce) 从生命周期的角度来看,mapredu ...

  4. MapReduce运行流程分析

    研究MapReduce已经有一段时间了.起初是从分析WordCount程序开始,后来开始阅读Hadoop源码,自认为已经看清MapReduce的运行流程.现在把自己的理解贴出来,与大家分享,欢迎纠错. ...

  5. MapReduce执行流程及程序编写

    MapReduce 一种分布式计算模型,解决海量数据的计算问题,MapReduce将计算过程抽象成两个函数 Map(映射):对一些独立元素(拆分后的小块)组成的列表的每一个元素进行指定的操作,可以高度 ...

  6. 辅助排序和Mapreduce整体流程

    一.辅助排序 需求:先有一个订单数据文件,包含了订单id.商品id.商品价格,要求将订单id正序,商品价格倒序,且生成结果文件个数为订单id的数量,每个结果文件中只要一条该订单最贵商品的数据. 思路: ...

  7. Hadoop Mapreduce运行流程

    Mapreduce的运算过程为两个阶段: 第一个阶段的map task相互独立,完全并行: 第二个阶段的reduce task也是相互独立,但依赖于上一阶段所有map task并发实例的输出: 这些t ...

  8. 016_笼统概述MapReduce执行流程结合wordcount程序

    数据传输<key,value>     File-->  <key,value>  -->map(key,value)  --> mapResult<k ...

  9. 2.25-2.26 MapReduce执行流程Shuffle讲解

    原文链接:https://langyu.iteye.com/blog/992916 Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle是 ...

随机推荐

  1. 谈JavaScript的继承

    最近在忙前端的工作,因为之前做.net和php的开发比较多,前端开发喜欢把库拿来就用,几次事实证明,不懂原理,连改代码也改不好,所以还是下定决心研究下JavaScript的几个技术难点. 0x1.Ja ...

  2. sql语句,实践证明了某种情况下not in的效率高于not exists

    只要百度not in和not exists,清一色的not exists的效率优于not in,毕竟not exists只是去强调是否返回结果集,只是一个bool值,而not in是返回一个结果集,是 ...

  3. H5微场景宽、高度自适应办法

    最近在做一些手机端微场景,发现处理各种手机屏幕分辨率是个很让人头疼的事情,最终找到了一个处理效果比较满意的方案.各位客观请往下看: 如果有过做微场景经历的客官们应该都了解,在代码中给一个元素的宽高设成 ...

  4. maven构建maven-project和maven-module

    在Eclipse中创建Maven多模块工程的例子 更多0   如果,你需要创建多个项目,项目之间即独立又有关系,那么创建一个Maven多模块项目是个非常好的选择,也非常cool!怎么在Eclipse里 ...

  5. 类似于qq空间类型的评论和回复

    最近学习thinkphp,做了一个博客系统,其中感觉实现一个类似于qq空间的评论和回复功能比较复杂,所以把这次的经历记录下来,与大家共勉,具体的方法就不说了,在这里分享一下思路. 目标就是这种,关键是 ...

  6. Objective-C日记-之类别Category

    类别Category 1,概述 为现有类添加新的方法,这些新方法的Objective-C的术语为“类别”. 2,用法 a,声明类别 @interface NSString(NumberConvenie ...

  7. 浅谈HTML5中的浮动问题

    浮动是我们在前端页面中经常会用到的一种布局方式.那什么是浮动呢? 首先我们先来看一下它的定义.浮动是指让元素脱离文档标准流(脱标),按照指定的方向去横向排列.浮动的取值有两个,分别是float:lef ...

  8. 1692: [Usaco2007 Dec]队列变换(BZOJ1640强化版)

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 682  Solved: 280[Submit][Sta ...

  9. 分享小知识:善用Group By排序

    以下列举了公用表/临时表/聚合函数三个因素为例子(覆盖索引因素除外,有利用此类索引都会以索引顺序)  环境: Microsoft SQL Server 2014 (SP1-GDR) (KB319472 ...

  10. PHP语言开发微信公众平台(订阅号)之开启基本功能及获得可用的服务器地址(2)

    1.开启群发功能(单击功能菜单里的"群发功能",并在右侧页面中点击"同意以上声明") 2.(1)在开启开发者模式之前需要完善个人资料(完成头像上传即可) (2) ...