MapReduce 图解流程超详细解答(1)-【map阶段】
转自:http://www.open-open.com/lib/view/open1453097241308.html
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任务:初始化
在初始化阶段,我们:
- 创建一个上下文对象(context )(TaskAttemptContext)
- 创建用户map.class实例
- 设置输入
- 设置输出
- 创建mapper的上下文(
MapContext.class
,Mapper.Context.class)
- 初始化输入也就是:
- 创建
SplitLineReader.class 分片行阅读器
- 创建HdfsDataInputStream.class hdfs数据输入流
Map任务:执行阶段
执行阶段通过 Mapper
class.的run()方法:
用户可以重写这个方法,但是默认的时候通常会调用setup而启动这个程序。这个函数默认并不做什么有用的 事情,但是可以被用户覆盖重写以便于设置任务(例如初始化类的变量),当设置完成之后,分片的每一个键值对会激发map()方法。因此map()接收到一个键,一个值,以及一个上下文context。使用这个上下文对象,一个map就会存储其输出到缓存中。
请注意,map分片是一个快一个块截取的(例如64kb),每一个快分割成为若干键值对的数据( SplitLineReader.class干的好事
),这是在Mapper.Context.nextKeyValue内部完成的。当map分片被全部处理之后,run()会调用clean()方法。默认的,没有什么会被执行,除非用户重写覆盖他。
map任务:溢写阶段
MapTask.MapOutputBuffer
)。缓冲区的大小是固定的,通过mapreduce.task.io.sort.mb
(default: 100MB)指定。mapreduce.map. sort.spill.percent
: 默认80% ),溢写将会被执行(这是一个并行过程,使用的是单独的线程,缓冲池还可以继续被写入)。如果溢写线程太慢,而缓冲区又忙了的话,map()就会暂停执行而等待。- 创建一个溢写记录
SpillRecord
和一个FSOutputStream
文件输出流(本地文件系统) - 内存内排序缓冲中的块:输出的数据会使用快排算法按照partitionIdx, key排序
- 排序之后的输出会分割成为分区:每一个分区对应一个reduce
- 分区序列化写到本地文件
来自: http://blog.csdn.net//mrcharles/article/details/50465626
MapReduce 图解流程超详细解答(1)-【map阶段】的更多相关文章
- MapReduce 图解流程超详细解答(2)-【map阶段】
接上一篇讲解:http://blog.csdn.net/mrcharles/article/details/50465626 map任务:溢写阶段 正如我们在执行阶段看到的一样,map会使用Mappe ...
- CF468C Hack it! 超详细解答
CF468C Hack it! 超详细解答 构造+数学推导 原文极简体验 CF468C Hack it! 题目简化: 令\(f(x)\)表示\(x\)在十进制下各位数字之和 给定一整数\(a\)构造\ ...
- MapReduce 图解流程
Anatomy of a MapReduce Job In MapReduce, a YARN application is called a Job. The implementation of t ...
- JDK的下载及安装教程图解(超详细哦~)
一.本人电脑系统介绍及JDK下载途径 1.先说明一下我的电脑为win10系统,64位操作系统~ 2.我选择下载的JDK版本为1.8版本.给大家来两个下载渠道,方便大家的下载~ JDK官网:https: ...
- MapReduce与Yarn 的详细工作流程分析
MapReduce详细工作流程之Map阶段 如上图所示 首先有一个200M的待处理文件 切片:在客户端提交之前,根据参数配置,进行任务规划,将文件按128M每块进行切片 提交:提交可以提交到本地工作环 ...
- [转]超详细图解:自己架设NuGet服务器
本文转自:http://diaosbook.com/Post/2012/12/15/setup-private-nuget-server 超详细图解:自己架设NuGet服务器 汪宇杰 ...
- SVN入门图解教程(超详细)
SVN入门图解教程(超详细) 一.总结 一句话总结: 二.SVN入门教程 1. 什么是SVN SVN全名Subversion,即版本控制系统.SVN与CVS一样,是一个跨平台的软件,支持大多数常见的操 ...
- 超详细SQL SERVER 2016跨网段和局域网发布订阅配置图解和常见问题
原文:超详细SQL SERVER 2016跨网段和局域网发布订阅配置图解和常见问题 转载标明出处:http://blog.csdn.net/u012861467 前方高能,要有点耐心,图片较多,注意在 ...
- Linux服务器上迁移项目路径,修改nginx配置,迁移及备份MongoDB数据库流程 (超详细)!!!
缘由:客户服务器项目路径不是很合理,导致Jenkins自动部署时还需要添加路径后再更新部署,所以需要把项目路径统一和规范化. 迁移项目路径,保证路径合规,同时做好备份和迁移.迁移后先安装好依赖. 项目 ...
随机推荐
- 设计模式-观察者模式(Observer Pattern)
观察者模式(Observer Pattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 观察者 ...
- apache-tomcat-7.0.53-windows-x86或者x64:出现错误提示:(Unable to open the service 'tomcat7)或者(Failed installing 'Tomcat7' service) tomcat7 %1 不是有效的 Win32 应用程序。
具体 安装行动 :打开下令 行提醒 符窗口 => 进入Tomcat安装目次 ==> 进入bin目次 下==> 输入:service.bat install 即可而且tomcat_ho ...
- Django在Win7下安装与创建项目hello word示例
Django在Win7下的安装及创建项目hello word的例子 有关python 的django 框架安装与开发的小例子.Django在Win7下的安装及创建项目hello word.1.安装:命 ...
- 坊间流传着的关于谷歌大牛Jeff Dean的传说
Jeff Dean,Google的软件架构天才.Google大型并发编程框架Map/Reduce作者. 在Google,公司最顶尖的编程高手Jeff Dean曾发明过一种先进的方法,该方法可以让一个程 ...
- nginx 配置http重定向到https
在80端口的那个server下,添加如下: server_name www.youwebsite.com youwebsite.com; rewrite ^(.*)$ https://$host$1 ...
- Android-优化UI性能(1)-降低主线程的堵塞时间
Android-优化UI性能(1)-降低主线程的堵塞时间 一 降低主线程的堵塞时间 Android已经提供了AsyncTask实现从主线程生成新的异步任务的方法. 定义并实现以下的类就可以(方法由系统 ...
- placement new (转)
原文出自:http://www.cnblogs.com/wanghetao/archive/2011/11/21/2257403.html 1. placement new的含义placement n ...
- [AWS vs Azure] 云计算里AWS和Azure的探究(2)
Amazon EC2是Elastic Compute Cloud的简称,翻译成中文就是弹性计算云.它是Amazon云里面最基础的内容,也是发展到今天最成熟的部分,通过EC2, 你可以在Amazon的云 ...
- QQ通信原理及QQ是怎么穿透内网进行通信的?
http://blog.csdn.net/frank_good/article/details/51160027 ******************************************* ...
- Spring boot 报错 Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
在实际开发中修改别人的代码,发现了这个报错,后来发现是因为pom.xml里面 只要将注释掉的部分注释掉就好了.