基于作业大小因素,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模式的处理:

  1. // 如果Job在Uber模式下运行,启动构造容器分配器LocalContainerAllocator实例
  2. if (job.isUber()) {
  3. MRApps.setupDistributedCacheLocal(getConfig());
  4. this.containerAllocator = new LocalContainerAllocator(
  5. this.clientService, this.context, nmHost, nmPort, nmHttpPort
  6. , containerID);
  7. } else {
  8. / 否则构造RM容器分配器RMContainerAllocator实例
  9. this.containerAllocator = new RMContainerAllocator(
  10. this.clientService, this.context);
  11. }

可见,如果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()方法,如下:

  1. // 如果Job在Uber模式下运行,启动构造本地容器加载器LocalContainerLauncher实例
  2. if (job.isUber()) {
  3. this.containerLauncher = new LocalContainerLauncher(context,
  4. (TaskUmbilicalProtocol) taskAttemptListener);
  5. } else {
  6. / 否则,构造容器加载器ContainerLauncherImpl实例
  7. this.containerLauncher = new ContainerLauncherImpl(context);
  8. }

也是针对Uber模式和Non-Uber模式分别处理,如果Job在Uber模式下运行,启动构造本地容器加载器LocalContainerLauncher实例;否则,构造容器加载器ContainerLauncherImpl实例。

另外,由于Uber模式下不管是Map Task,还是Reduce Task,均在同一个Container中顺序执行,所以MapReduce的推测执行机制对于Uber模式是不适用的,故在MRAppMaster服务启动的serviceStart()方法中,对于Uber模式,会禁用推测执行机制,相关代码如下:

  1. if (job.isUber()) {
  2. / Uber模式下禁用推测执行机制,即Disable Speculation
  3. speculatorEventDispatcher.disableSpeculation();
  4. LOG.info("MRAppMaster uberizing job " + job.getID()
  5. + " in local container (\"uber-AM\") on node "
  6. + nmHost + ":" + nmPort + ".");
  7. } else {
  8. // send init to speculator only for non-uber jobs.
  9. // This won't yet start as dispatcher isn't started yet.
  10. / Non-Uber模式下发送SpeculatorEvent事件,初始化speculator
  11. dispatcher.getEventHandler().handle(
  12. new SpeculatorEvent(job.getID(), clock.getTime()));
  13. LOG.info("MRAppMaster launching normal, non-uberized, multi-container "
  14. + "job " + job.getID() + ".");
  15. }

可以看到,Uber模式下禁用推测执行机制,即Disable Speculation,Non-Uber模式下发送SpeculatorEvent事件,初始化speculator,因此,对于Uber模式,会禁用推测执行机制。

在作业的抽象实现JobImpl中,会针对Uber模式进行一些特定参数设置,如下:

  1. if (isUber) {
  2. LOG.info("Uberizing job " + jobId + ": " + numMapTasks + "m+"
  3. + numReduceTasks + "r tasks (" + dataInputLength
  4. + " input bytes) will run sequentially on single node.");
  5. // make sure reduces are scheduled only after all map are completed
  6. // mapreduce.job.reduce.slowstart.completedmaps参数设置为1,
  7. // 即全部Map任务完成后才会为Reduce任务分配资源
  8. conf.setFloat(MRJobConfig.COMPLETED_MAPS_FOR_REDUCE_SLOWSTART,
  9. 1.0f);
  10. // uber-subtask attempts all get launched on same node; if one fails,
  11. // probably should retry elsewhere, i.e., move entire uber-AM:  ergo,
  12. // limit attempts to 1 (or at most 2?  probably not...)
  13. // 参数mapreduce.map.maxattempts、mapreduce.reduce.maxattempts设置为1,即Map、Reduce任务的最大尝试次数均为1
  14. conf.setInt(MRJobConfig.MAP_MAX_ATTEMPTS, 1);
  15. conf.setInt(MRJobConfig.REDUCE_MAX_ATTEMPTS, 1);
  16. // disable speculation
  17. // 参数mapreduce.map.speculative、mapreduce.reduce.speculative设置为false,即禁用Map、Reduce任务的推测执行机制
  18. conf.setBoolean(MRJobConfig.MAP_SPECULATIVE, false);
  19. conf.setBoolean(MRJobConfig.REDUCE_SPECULATIVE, false);
  20. }

主要包括:

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的更多相关文章

  1. Yarn源码分析之MRAppMaster上MapReduce作业处理总流程(一)

    我们知道,如果想要在Yarn上运行MapReduce作业,仅需实现一个ApplicationMaster组件即可,而MRAppMaster正是MapReduce在Yarn上ApplicationMas ...

  2. Yarn源码分析之MRAppMaster上MapReduce作业处理总流程(二)

    本文继<Yarn源码分析之MRAppMaster上MapReduce作业处理总流程(一)>,接着讲述MapReduce作业在MRAppMaster上处理总流程,继上篇讲到作业初始化之后的作 ...

  3. Yarn源码分析之MapReduce作业中任务Task调度整体流程(一)

    v2版本的MapReduce作业中,作业JOB_SETUP_COMPLETED事件的发生,即作业SETUP阶段完成事件,会触发作业由SETUP状态转换到RUNNING状态,而作业状态转换中涉及作业信息 ...

  4. Yarn源码分析之如何确定作业运行方式Uber or Non-Uber?

    在MRAppMaster中,当MapReduce作业初始化时,它会通过作业状态机JobImpl中InitTransition的transition()方法,进行MapReduce作业初始化相关操作,而 ...

  5. YARN源码分析(一)-----ApplicationMaster

    转自:http://blog.csdn.net/androidlushangderen/article/details/48128955 YARN学习系列:http://blog.csdn.net/A ...

  6. Yarn源码分析之事件异步分发器AsyncDispatcher

    AsyncDispatcher是Yarn中事件异步分发器,它是ResourceManager中的一个基于阻塞队列的分发或者调度事件的组件,其在一个特定的单线程中分派事件,交给AsyncDispatch ...

  7. Yarn源码分析1(Hadoop2.7.2)

    在Hadoop中,调度框架YARN(Yet Another Resource Negotiater)是基于事件的,调度的是MapReduce的Application.Application有一系列的状 ...

  8. Yarn源码分析之参数mapreduce.job.reduce.slowstart.completedmaps介绍

    mapreduce.job.reduce.slowstart.completedmaps是MapReduce编程模型中的一个参数,这个参数的含义是,当Map Task完成的比例达到该值后才会为Redu ...

  9. Hadoop2源码分析-YARN 的服务库和事件库

    1.概述 在<Hadoop2源码分析-YARN RPC 示例介绍>一文当中,给大家介绍了YARN 的 RPC 机制,以及相关代码的演示,今天我们继续去学习 YARN 的服务库和事件库,分享 ...

随机推荐

  1. AppCompatActivity与toolbar的结合

    原文:http://www.51itong.net/android-activity-appcompatactivity-toolbar-15750.html 另外一个博客:Android 5.x T ...

  2. U盘安装Ubuntu 16.04出现:Failed to load ldlinux.c32

    启动的时候如果不开启UEFI,则会提示: Failed to load ldlinux.c32 Boot failed: please change disks and press a key to ...

  3. Delphi 窗体失踪在最上面的代码

    unit ufrmSysPubMessage; interface uses  Windows, Forms, Messages, Classes, ExtCtrls, Controls, StdCt ...

  4. MythXinWCF通用宿主绿色版发布(一键启动,方便快捷)

    这是我开发的一款免费的,绿色的WCF宿主工具,一键启动,方便快捷,省去了安装和配置IIS的麻烦,也不需要配置文件. 该工具运行环境为.Net Framework 4.5.1(这个是必装的,win10自 ...

  5. 【spring】spring boot中使用@EnableTransactionManagement 以后,spring mvc接收前台ajax的post方法传过来的参数,使用@RequestBody接收不到参数

    在启动类上添加了注解: @EnableTransactionManagement, postMan测试接口,以这种方式传递参数: 测试结果: 接收不到参数 问题解决: 原因:是因为 这个项目中的Con ...

  6. 让IE浏览器支持HTML5

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  7. 获取配置文件中的key的value

    获取App.config文件的key的value System.Configuration.ConfigurationManager.AppSettings["keyName"] ...

  8. 设计工具-MindManager(思维导图)

    1,百度百科 http://baike.baidu.com/view/30054.htm?from_id=7153629&type=syn&fromtitle=MindManager& ...

  9. Solr6.6 配置中文分词库mmseg4j

    1.准备 首先安装solr:参照搜索引擎Solr-6.6.0搭建,如果版本高于6,可能会不支持,需要改mmseg4j包 mmseg4j包下载: mmseg4j-solr-2.3.0-with-mmse ...

  10. 2017.10.25 es-sql分页无效

    1.问题描述 使用es-sql聚合查询时,发现无法进行分页操作. 结果为16条: 当使用limit语法进行分页之后,发现并没有效果(以取5条记录为一页为例). 首先查询前5条记录: 返回的记录如下图: ...