转自:http://www.open-open.com/lib/view/open1453097241308.html

在MapReduce中,一个YARN  应用被称作一个job, MapReduce 框架提供的应用,master的一个实现被称作MRAppMaster

MapReduce Job的时间线

MapReduce Job  运行的时间线:

  • Map Phase:若干 Map Tasks 被执行
  • Reduce Phase: 若干Reduce Tasks 被执行

reduce可能会在map阶段结束之前开始执行,因此上面显示的有重叠的地方。

Map Phase

现在我们集中考察map相,一个关键的问题是一个应用需要多少map任务去运行现在的这个job

用户给了我们什么?

我们退回到之前的一步,当一个用户提交一个应用的时候,若干信息被提供给了YARN ,分别是:

  • 一个配置:这可以是一部分的,因为一些参数不需要用户特别指定,可以有自己的默认值。
  • 一个jar文件,含有一个map,一个combiner,一个reduce
  • 一个输入和输出信息 输入目录 是不是在hdfs上,有多少文件呢?输出的时候,我们存储在哪里

The number of files inside the input directory is used for deciding the number of Map Tasks of a job.
那么,输入的目录中文件的数量决定多少个map会被运行起来

多少个map任务?

应用针对每一个分片运行一个map,一般而言,对于每一个输入的文件会有一个map split。如果输入文件太大,超过了hdfs块的大小(64M)那么对于同一个输入文件我们会有多余2个的map运行起来。下面是FileInputFormat class 的getSplits()的伪代码: 

num_splits = 0
for each input file f:
remaining = f.length
while remaining / split_size > split_slope:
num_splits += 1
remaining -= split_size

where:

split_slope = 1.1 分割斜率
split_size =~ dfs.blocksize 分割大小约等于hdfs块大小

在mapreduce2.0以上版本mapreduce.job.maps 属性会被忽略

MapTask Launch
启动MapTask

mapreduce应用会向资源管理器请求这个job需要的容器,一个maptask容器请求每一个maptask。一个容器对每一个maptask的请求会尝试利用map分片的本地性,应用会请求一下数据:

  • 请求map split 和container在同一个节点管理器的container
  • 如果没有,请求一个map split 和container在同一个机架上的节点管理器上的container
  • 否则请求任意节点管理器上的container

这只是一小部分资源任务。资源任务器在资源任务器既定目标和指定目标冲突的时候,可以忽略本地性。当一个容器被分配一个任务,map就马上启动了。

Map阶段:一个执行阶段的例子

map 相的一个简要图:

  • 有两个节点管理器:每一个2GB的内存,每一个map需要1GB我们可以并行运行两个容器。这是最好的情况,而资源任务器的决策可能会有所不同
  • 集群没有其他的YARN任务运行
  • 我们的job有8个map分片,也就是在输入文件夹中有7个文件,只有一个是大于hdfs块大小的,需要被拆分为两个文件。

map任务的执行时间线

现在我们可以聚焦单个的map task:这是单个map的执行时间线:

  • 初始相:我们设置map任务
  • 执行相:map分片里面的每一个键值对进行map()函数运算
  • 溢写相:map的输出保存在环形内存缓冲区,当缓冲区满80%(一般80%),启动溢写相,将缓冲的数据写出到磁盘。
  • 洗牌相:在溢写相的结尾,我们合并多有的输出,并且打包他们以便进行reduce相处理。

map任务:初始化

在初始化阶段,我们:

 
  1. 创建一个上下文对象(context )(TaskAttemptContext)
  2. 创建用户map.class实例
  3. 设置输入
  4. 设置输出
  5. 创建mapper的上下文(MapContext.classMapper.Context.class)
  6. 初始化输入也就是:
  7. 创建 SplitLineReader.class 分片行阅读器
  8. 创建HdfsDataInputStream.class hdfs数据输入流

Map任务:执行阶段

执行阶段通过 Mapper class.的run()方法:

用户可以重写这个方法,但是默认的时候通常会调用setup而启动这个程序。这个函数默认并不做什么有用的 事情,但是可以被用户覆盖重写以便于设置任务(例如初始化类的变量),当设置完成之后,分片的每一个键值对会激发map()方法。因此map()接收到一个键,一个值,以及一个上下文context。使用这个上下文对象,一个map就会存储其输出到缓存中。

请注意,map分片是一个快一个块截取的(例如64kb),每一个快分割成为若干键值对的数据( SplitLineReader.class干的好事),这是在Mapper.Context.nextKeyValue内部完成的。当map分片被全部处理之后,run()会调用clean()方法。默认的,没有什么会被执行,除非用户重写覆盖他。

map任务:溢写阶段

正如我们在执行阶段看到的一样,map会使用Mapper.Context.write()将map函数的输出溢写到内存中的环形缓冲区 (MapTask.MapOutputBuffer)。缓冲区的大小是固定的,通过mapreduce.task.io.sort.mb (default: 100MB)指定。
任何时候当这个缓冲区将要充满的时候(mapreduce.map. sort.spill.percent: 默认80% ),溢写将会被执行(这是一个并行过程,使用的是单独的线程,缓冲池还可以继续被写入)。如果溢写线程太慢,而缓冲区又忙了的话,map()就会暂停执行而等待。
溢写线程执行下面的动作:
  1. 创建一个溢写记录SpillRecord 和一个FSOutputStream 文件输出流(本地文件系统)
  2. 内存内排序缓冲中的块:输出的数据会使用快排算法按照partitionIdx, key排序
  3. 排序之后的输出会分割成为分区:每一个分区对应一个reduce
  4. 分区序列化写到本地文件

来自: http://blog.csdn.net//mrcharles/article/details/50465626

MapReduce 图解流程超详细解答(1)-【map阶段】的更多相关文章

  1. MapReduce 图解流程超详细解答(2)-【map阶段】

    接上一篇讲解:http://blog.csdn.net/mrcharles/article/details/50465626 map任务:溢写阶段 正如我们在执行阶段看到的一样,map会使用Mappe ...

  2. CF468C Hack it! 超详细解答

    CF468C Hack it! 超详细解答 构造+数学推导 原文极简体验 CF468C Hack it! 题目简化: 令\(f(x)\)表示\(x\)在十进制下各位数字之和 给定一整数\(a\)构造\ ...

  3. MapReduce 图解流程

    Anatomy of a MapReduce Job In MapReduce, a YARN application is called a Job. The implementation of t ...

  4. JDK的下载及安装教程图解(超详细哦~)

    一.本人电脑系统介绍及JDK下载途径 1.先说明一下我的电脑为win10系统,64位操作系统~ 2.我选择下载的JDK版本为1.8版本.给大家来两个下载渠道,方便大家的下载~ JDK官网:https: ...

  5. MapReduce与Yarn 的详细工作流程分析

    MapReduce详细工作流程之Map阶段 如上图所示 首先有一个200M的待处理文件 切片:在客户端提交之前,根据参数配置,进行任务规划,将文件按128M每块进行切片 提交:提交可以提交到本地工作环 ...

  6. [转]超详细图解:自己架设NuGet服务器

    本文转自:http://diaosbook.com/Post/2012/12/15/setup-private-nuget-server 超详细图解:自己架设NuGet服务器 汪宇杰          ...

  7. SVN入门图解教程(超详细)

    SVN入门图解教程(超详细) 一.总结 一句话总结: 二.SVN入门教程 1. 什么是SVN SVN全名Subversion,即版本控制系统.SVN与CVS一样,是一个跨平台的软件,支持大多数常见的操 ...

  8. 超详细SQL SERVER 2016跨网段和局域网发布订阅配置图解和常见问题

    原文:超详细SQL SERVER 2016跨网段和局域网发布订阅配置图解和常见问题 转载标明出处:http://blog.csdn.net/u012861467 前方高能,要有点耐心,图片较多,注意在 ...

  9. Linux服务器上迁移项目路径,修改nginx配置,迁移及备份MongoDB数据库流程 (超详细)!!!

    缘由:客户服务器项目路径不是很合理,导致Jenkins自动部署时还需要添加路径后再更新部署,所以需要把项目路径统一和规范化. 迁移项目路径,保证路径合规,同时做好备份和迁移.迁移后先安装好依赖. 项目 ...

随机推荐

  1. sqlserver自定义函数与存储过程的区别 实例详解

    分享下sql server自定义函数与存储过程的区别,一起来学习下. 一.自定义函数: 1. 可以返回表变量 2. 限制颇多,包括 不能使用output参数: 不能用临时表: 函数内部的操作不能影响到 ...

  2. Android 两个界面间快速切换时,会发现有短暂黑屏

    这种问题一般是因为一个Activity启动之后在显示视图之间时间太长导致的. 1.优化方式可以通过精简layout文件.多线程处理数据载入等. 2.但是有些Activity的layout文件可能比较大 ...

  3. HTML5学习笔记(二十四):DOM扩展

    DOM扩展 DOM标准扩展最开始都是来自各个浏览器的自定义扩展DOM的功能,后被收录为标准的DOM相关API. 本笔记只记录被各大浏览器支持的标准扩展,对于特定浏览器的专有扩展不讨论. 选择符API ...

  4. angular学习笔记(三十)-指令(6)-transclude()方法(又称linker()方法)-模拟ng-repeat指令

    在angular学习笔记(三十)-指令(4)-transclude文章的末尾提到了,如果在指令中需要反复使用被嵌套的那一坨,需要使用transclude()方法. 在angular学习笔记(三十)-指 ...

  5. (原创)c++11改进我们的模式之改进表驱动模式

    所谓表驱动法(Table-Driven Approach),简单讲是指用查表的方法获取值.表驱动是将一些通过较为复杂逻辑语句来得到数据信息的方式,通过查询表的方式来实现,将数据信息存放在表里.对于消除 ...

  6. 如何让 zend studio 10 识别 Phalcon语法并且进行语法提示

    让 zend studio 10 识别 Phalcon语法并且进行语法提示 https://github.com/rogerthomas84/PhalconPHPDoc 下载解压后,把里面 phalc ...

  7. Mybatis的mapper注册

    既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了.但是首先我们需要告诉 MyBatis 到哪里去找到这些语句. Java 在自动查找这方面没有提供一个很好的方法 ...

  8. SQL2008R2 安装图解

    安装SQL Server 2008 R2需要.NET Framework 3.5 SP1支持 这里我们的操作系统是Windows Server 2008 R2,已经默认自带了.NET Framewor ...

  9. XnView查看图片实际大小

    找了很多软件,只有它可以显示尺寸大小. 各位如有别的发现,可留言推荐,谢谢

  10. UEFI格式预装win8安装win7

    如果本本预装的是win8,而且是较新款的机型,那么当你想要格掉win8,装win7系统时就会遇到问题.主要有两个: 1)安装win7时,笔记本无法识别系统光盘或u盘启动盘 ,提示:屏幕显示“image ...