Yarn源码分析之MRAppMaster:作业运行方式Local、Uber、Non-Uber
基于作业大小因素,MRAppMaster提供了三种作业运行方式:本地Local模式、Uber模式、Non-Uber模式。其中,
1、本地Local模式:通常用于调试;
2、Uber模式:为降低小作业延迟而设计的一种模式,所有任务,不管是Map Task,还是Reduce Task,均在同一个Container中顺序执行,这个Container其实也是MRAppMaster所在Container;
3、Non-Uber模式:对于运行时间较长的大作业,先为Map Task申请资源,当Map Task运行完成数目达到一定比例后再为Reduce Task申请资源。
在Yarn中,作业运行的资源,统一被抽象为容器Container,在MRAppMaster中关于作业运行时需要的资源的分配与加载代码中,容器分配申请服务、容器分配完成后加载服务中,都有关于Uber模式和Non-Uber模式的处理,如下:
1、容器分配申请路由服务
容器分配申请路由服务ContainerAllocatorRouter继承自AbstractService,是Hadoop中一个典型的服务,其正常提供服务需要经历初始化init、启动start等过程,而在服务启动的serviceStart()方法中,存在以下关于Uber模式和Non-Uber模式的处理:
- // 如果Job在Uber模式下运行,启动构造容器分配器LocalContainerAllocator实例
 - if (job.isUber()) {
 - MRApps.setupDistributedCacheLocal(getConfig());
 - this.containerAllocator = new LocalContainerAllocator(
 - this.clientService, this.context, nmHost, nmPort, nmHttpPort
 - , containerID);
 - } else {
 - / 否则构造RM容器分配器RMContainerAllocator实例
 - this.containerAllocator = new RMContainerAllocator(
 - this.clientService, this.context);
 - }
 
可见,如果Job在Uber模式下运行,启动构造容器分配器LocalContainerAllocator实例,否则构造RM容器分配器RMContainerAllocator实例。而LocalContainerAllocator代表的是本地容器分配器,其构造过程中传入的containerID为MRAppMaster的成员变量containerID,什么意思呢?不就正好说明LocalContainerAllocator所使用的容器,也就是Uber模式下所使用的容器,就是MRAppMaster所在Container,与上面所介绍的Uber模式正好一致,而Non-Uber模式下则需要使用Yarn的RMContainerAllocator,通过与ResourceManager进行通信来申请容器的分配,总的原则就是:先为Map Task申请资源,当Map Task运行完成数目达到一定比例后再为Reduce Task申请资源。
2、容器加载路由服务
容器加载路由服务ContainerLauncherRouter同样继承自AbstractService,也是Hadoop中一个典型的服务,我们同样看下服务启动serviceStart()方法,如下:
- // 如果Job在Uber模式下运行,启动构造本地容器加载器LocalContainerLauncher实例
 - if (job.isUber()) {
 - this.containerLauncher = new LocalContainerLauncher(context,
 - (TaskUmbilicalProtocol) taskAttemptListener);
 - } else {
 - / 否则,构造容器加载器ContainerLauncherImpl实例
 - this.containerLauncher = new ContainerLauncherImpl(context);
 - }
 
也是针对Uber模式和Non-Uber模式分别处理,如果Job在Uber模式下运行,启动构造本地容器加载器LocalContainerLauncher实例;否则,构造容器加载器ContainerLauncherImpl实例。
另外,由于Uber模式下不管是Map Task,还是Reduce Task,均在同一个Container中顺序执行,所以MapReduce的推测执行机制对于Uber模式是不适用的,故在MRAppMaster服务启动的serviceStart()方法中,对于Uber模式,会禁用推测执行机制,相关代码如下:
- if (job.isUber()) {
 - / Uber模式下禁用推测执行机制,即Disable Speculation
 - speculatorEventDispatcher.disableSpeculation();
 - LOG.info("MRAppMaster uberizing job " + job.getID()
 - + " in local container (\"uber-AM\") on node "
 - + nmHost + ":" + nmPort + ".");
 - } else {
 - // send init to speculator only for non-uber jobs.
 - // This won't yet start as dispatcher isn't started yet.
 - / Non-Uber模式下发送SpeculatorEvent事件,初始化speculator
 - dispatcher.getEventHandler().handle(
 - new SpeculatorEvent(job.getID(), clock.getTime()));
 - LOG.info("MRAppMaster launching normal, non-uberized, multi-container "
 - + "job " + job.getID() + ".");
 - }
 
可以看到,Uber模式下禁用推测执行机制,即Disable Speculation,Non-Uber模式下发送SpeculatorEvent事件,初始化speculator,因此,对于Uber模式,会禁用推测执行机制。
在作业的抽象实现JobImpl中,会针对Uber模式进行一些特定参数设置,如下:
- if (isUber) {
 - LOG.info("Uberizing job " + jobId + ": " + numMapTasks + "m+"
 - + numReduceTasks + "r tasks (" + dataInputLength
 - + " input bytes) will run sequentially on single node.");
 - // make sure reduces are scheduled only after all map are completed
 - // mapreduce.job.reduce.slowstart.completedmaps参数设置为1,
 - // 即全部Map任务完成后才会为Reduce任务分配资源
 - conf.setFloat(MRJobConfig.COMPLETED_MAPS_FOR_REDUCE_SLOWSTART,
 - 1.0f);
 - // uber-subtask attempts all get launched on same node; if one fails,
 - // probably should retry elsewhere, i.e., move entire uber-AM: ergo,
 - // limit attempts to 1 (or at most 2? probably not...)
 - // 参数mapreduce.map.maxattempts、mapreduce.reduce.maxattempts设置为1,即Map、Reduce任务的最大尝试次数均为1
 - conf.setInt(MRJobConfig.MAP_MAX_ATTEMPTS, 1);
 - conf.setInt(MRJobConfig.REDUCE_MAX_ATTEMPTS, 1);
 - // disable speculation
 - // 参数mapreduce.map.speculative、mapreduce.reduce.speculative设置为false,即禁用Map、Reduce任务的推测执行机制
 - conf.setBoolean(MRJobConfig.MAP_SPECULATIVE, false);
 - conf.setBoolean(MRJobConfig.REDUCE_SPECULATIVE, false);
 - }
 
主要包括:
1、mapreduce.job.reduce.slowstart.completedmaps参数设置为1,即全部Map任务完成后才会为Reduce任务分配资源;
2、参数mapreduce.map.maxattempts、mapreduce.reduce.maxattempts设置为1,即Map、Reduce任务的最大尝试次数均为1;
3、参数mapreduce.map.speculative、mapreduce.reduce.speculative设置为false,即禁用Map、Reduce任务的推测执行机制;
Yarn源码分析之MRAppMaster:作业运行方式Local、Uber、Non-Uber的更多相关文章
- Yarn源码分析之MRAppMaster上MapReduce作业处理总流程(一)
		
我们知道,如果想要在Yarn上运行MapReduce作业,仅需实现一个ApplicationMaster组件即可,而MRAppMaster正是MapReduce在Yarn上ApplicationMas ...
 - Yarn源码分析之MRAppMaster上MapReduce作业处理总流程(二)
		
本文继<Yarn源码分析之MRAppMaster上MapReduce作业处理总流程(一)>,接着讲述MapReduce作业在MRAppMaster上处理总流程,继上篇讲到作业初始化之后的作 ...
 - Yarn源码分析之MapReduce作业中任务Task调度整体流程(一)
		
v2版本的MapReduce作业中,作业JOB_SETUP_COMPLETED事件的发生,即作业SETUP阶段完成事件,会触发作业由SETUP状态转换到RUNNING状态,而作业状态转换中涉及作业信息 ...
 - Yarn源码分析之如何确定作业运行方式Uber or Non-Uber?
		
在MRAppMaster中,当MapReduce作业初始化时,它会通过作业状态机JobImpl中InitTransition的transition()方法,进行MapReduce作业初始化相关操作,而 ...
 - YARN源码分析(一)-----ApplicationMaster
		
转自:http://blog.csdn.net/androidlushangderen/article/details/48128955 YARN学习系列:http://blog.csdn.net/A ...
 - Yarn源码分析之事件异步分发器AsyncDispatcher
		
AsyncDispatcher是Yarn中事件异步分发器,它是ResourceManager中的一个基于阻塞队列的分发或者调度事件的组件,其在一个特定的单线程中分派事件,交给AsyncDispatch ...
 - Yarn源码分析1(Hadoop2.7.2)
		
在Hadoop中,调度框架YARN(Yet Another Resource Negotiater)是基于事件的,调度的是MapReduce的Application.Application有一系列的状 ...
 - Yarn源码分析之参数mapreduce.job.reduce.slowstart.completedmaps介绍
		
mapreduce.job.reduce.slowstart.completedmaps是MapReduce编程模型中的一个参数,这个参数的含义是,当Map Task完成的比例达到该值后才会为Redu ...
 - Hadoop2源码分析-YARN 的服务库和事件库
		
1.概述 在<Hadoop2源码分析-YARN RPC 示例介绍>一文当中,给大家介绍了YARN 的 RPC 机制,以及相关代码的演示,今天我们继续去学习 YARN 的服务库和事件库,分享 ...
 
随机推荐
- Mybatis通过ID查询 && 通过name模糊查询
			
接上篇:Mybatis环境搭建 在搭建环境时已经有了mapper和sqlMapConfig 1,数据库建表 prompt PL/SQL Developer import file prompt Cre ...
 - linux-去重-uniq
			
uniq : 默认(去重) | -d(显重) | -u(删重) 语法:uniq [选项] 文件 选项 -c或--count 在每列旁边显示该行重复出现的次数 -d或--repeat 仅 ...
 - Swift,函数
			
1.无参数无输出的函数 func a(){ print("HI") } a() //HI 2.有参数有输出的函数 func add(a:Int,b:Int)->Int{ // ...
 - 一个 关于 case when的SQL
			
[例]从stud_grade表中查询所有同学考试成绩情况,凡成绩为空者输出“未考”.小于60分输出“不及格”.60分至70分输出“及格”.70分至90分输出“良好”.大于或等于90分时输出“优秀”. ...
 - 关于constraint 的disable和enable
			
建立主外键的constraint create table emp1(emp_no number(2) constraint emp_emp_no_pk primary key,ename varch ...
 - python3读取html文件
			
# htmlf=open('E:\\test2.html','r',encoding="utf-8") # htmlcont=htmlf.read() # print(type(h ...
 - libcurl库的使用(通过libcurl库下载url图像) 【转】
			
http://www.linuxidc.com/Linux/2015-09/123609.htm?utm_source=tuicool&utm_medium=referral libcurl库 ...
 - mycat读写分离与主从切换
			
1, 分库分表的优缺点.以及为什么分表方式无法成为主流? 分表:在台server上,长处是易维护,相似表分区.缺点是在一台dbserver上.无法分担IO.负载集中. 分库:在多台server上,长处 ...
 - Java Volatile keyword
			
Volatile修饰的成员变量在每次被线程訪问时,都强迫从主内存中重读该成员变量的值.并且,当成员变量发生变化时,强迫线程将变化值回写到主内存.这样在不论什么时刻,两个不同的线程总是看到某个成员变量的 ...
 - [转载]Android开发者必须深入学习的10个应用开源项目
			
[转载]Android开发者必须深入学习的10个应用开源项目 原文地址:Android开发者必须深入学习的10个应用开源项目(http://blog.sina.com.cn/s/blog_7b8a63 ...