YARN(MapReduce2)

Yet Another Resource Negotiator / YARN Application Resource Negotiator
对于节点数超出4000的大型集群,MapReduce1系统开始面临着扩展性瓶颈。所以有了YARN的出现。
YARN将jobtracker的职能划分为多个独立的实体,从而改善了MR1面临的扩展瓶颈问题。Jobtracker负责作业调度和任务进度监视,跟踪任务、重启失败或过慢的任务和进行任务登记,例如维护计数器总数。
YARN将这两种角色划分为两个独立的守护进程:管理集群上资源使用的资源管理器(Resource Manager)和管理集群上运行任务生命周期的应用管理器(Application master)。基本思路是:应用服务器与资源管理器协商集群的计算资源:容器(containers,每个容器都有特定的内存上限),在这些容器上运行特定应用程序的进程。容器由集群节点上运行的节点管理器(NodeManager)监视,以确保应用程序使用的资源不会超过分配给它的资源。
与jobtracker不同,应用的每个实例(一个MapReduce任务)有一个专用的应用master,它运行在应用的运行期间。
YARN上的MapReduce比经典的MapReduce包括更多的实体
1. 提交MapReduce作业的客户端
2. YARN资源管理器(ResourceManager),负责协调集群上计算资源的分配
3. YARN节点管理器(NodeManager),负责启动和监视集群中机器上的计算容器(container)
4. MapReduce应用程序master负责协调运行MapReduce作业的任务。它和MapReduce任务在容器中运行,这些容器由资源管理器分配并由节点管理器进行管理
5. 分布式文件系统(一般为HDFS),用来与其他实体间共享作业文件
作业运行过程如图

一、作业的提交

1. MapReduce2中的作业提交是使用与MapReduce1相同的用户API
2. 从资源管理器获取新的作业ID,在YARN命名法中它是一个应用程序ID
3. 作业客户端检查作业的输出说明,计算输入分片并将作业资源(包括作业JAR、配置和分片信息)复制到HDFS。
4. 通过调用资源管理器上的submitApplication方法提交作业

二、作业初始化

5. 资源管理器收到调用它的submitApplication消息后,便将请求传递给调度器(scheduler)。调度器分配一个容器,然后资源管理器在节点管理器的管理下在容器中启动应用程序的master进程
6. MapReduce作业的application master是一个Java应用程序,它的主类是MRAppMaster。它对作业进行初始化:通过创建多个簿记对象以保持对作业进度的跟踪,因为它将接受来自任务的进度和完成报告
7. 接下来master接受来自共享文件系统的在客户端计算的输入分片,对每一个分片创建一个map任务对象一级有mapreduce.job.reduces属性确定的多个reduce任务对象
接下来,application master决定如何运行构成MapReduce作业的各个任务。如果作业很小,就选择在与它同一个JVM上运行任务
相对于在一个节点上顺序运行他们,判断在新的容器中分配和运行任务的开销大于并行运行它们的开销时,就会发生这一情况。这不同于MapReduce1,MapReduce1从不在单个tasktracker上运行小作业。这样的作业称为uberized,或者作为uber任务运行。
哪些任务是小任务?默认情况下,小任务就是小于10个mapper且只有一个reducer且输入大小小于一个HDFS块的任务。(通过设置mapreduce.job.ubertask.maxmaps、mapreduce.job.ubertask.maxreduces和mapreduce.job.ubertask.maxbytes可以改变一个作业的上述值)。将mapreduce.job.ubertask.enable设置为false也可以完全使uber任务不可用。
在任何任务运行之前,作业的setup方法为了设置作业的Outputcommiter被调用来建立作业的输出目录。在MapReduce1中,它在一个由tasktracker运行的特殊任务中被调用(作业创建),而在YARN执行框架中,该方法由应用程序master直接调用。

三、任务分配

8. 如果作业不适合作为uber任务运行,那么application master就会为该作业中的左右map任务和reduce任务向资源管理器请求容器。心跳信息的请求包括每个map任务的数据本地化信息,特别是输入分片所在的主机和相应机架信息。调度器使用这些信息来做调度决策(像jobtracker的调度器一样)。理想情况下,它将任务分配到数据本地化的节点,但如果不可能这样做,调度器就会相对于非本地化的分配优先使用机架本地化的分配。
请求也为任务制定了内存需求。在默认情况下,map任务和reduce任务都分配到1024MB的内存,但这可以通过mapreduce.map.memory.mb和mapreduce.reduce.memory.mb来设置。
内存的分配方式不同于MapReduce1,MapReduce1中tasktrackers有在集群配置时设置的固定数量的槽,每个任务在一个槽上运行。槽有最大内存分配限制,这对集群是固定的,导致当任务使用较少内存时无法充分利用内存(因为其他等待的任务不能使用这些未使用的内存)以及由于任务不能获取足够内存而导致作业失败。
在YARN中,资源分为更细的粒度,所以可以避免上述问题。应用程序可以请求最小到最大限制范围的任意最小值倍数的内存容量。默认的内存分配容量是调度器特定的,对于容量调度器,它的默认值最小值是1024MB(由yarn.scheduler.capacity.minimum-allocation-mb设置),默认的最大值是10240MB(由yarn.scheduler.capacity.maximum-allocation-mb设置)。因此,任务可以通过适当设置mapreduce.map.memory.mb和mapreduce.reduce.memory.mb来请求1GB到10GB间的任意1GB倍数的内存容量(调度器在需要的时候使用最接近的倍数)

四、任务执行

9. 一旦资源管理器的调度器(scheduler)为任务分配了容器,application master就通过与节点管理器通信来启动容器(container)
10. 该任务由主类为YarnChild的Java应用程序执行。在它运行任务之前,首先将任务需要的资源本地化,包括作业的配置、JAR文件和所有来自分布式缓存的文件
11. 运行map任务和reduce任务

五、进度和状态更新

在YARN下运行时,任务每三秒通过umbilical接口向application master汇报进度和状态(包含计数器),作为作业的汇聚试图(aggregate view),如下图。MapReduce1通过tasktracker到jobtracker来实现进度更新。

客户端每秒钟(通过mapreduce.client.progressmonitor.pollinterval设置)查询一次application master以接收进度更新,通常都会向用户显示。
在MapReduce1中,作业跟踪器的Web UI展示运行作业列表及其进度。在YARN中,资源管理器的Web UI展示了正在运行的应用以及连接到的对应application master,每个application master展示MapReduce作业的进度等进一步的细节。

六、作业完成

除了向application master查询进度外,客户端每5秒钟还通过调用Job的waitForCompletion来检查作业是否完成。查询的间隔可以通过mapreduce.client.completion.pollinterval属性进行设置。
作业完成后,application master和任务容器清理其工作状态,OutputCommiter的作业清理方法会被调用。作业历史服务器保存作业的信息供用户需要时查询。

YARN作业提交流程剖析的更多相关文章

  1. Hadoop2.x Yarn作业提交(客户端)

    转自:http://blog.csdn.net/lihm0_1/article/details/22186833 YARN作业提交的客户端仍然使用RunJar类,和MR1一样,可参考 http://b ...

  2. YARN-MapReduce的作业提交流程

    YARN分布式资源管理系统 组成: ResourceManager:YARN的资源管理器,主节点,通过NodeManager管理集群中所有的资源 NodeManager:YARN的节点管理器,从节点, ...

  3. yarn作业提交过程源码

    记录源码细节,内部有中文注释 Client 端: //最终通过ApplicationClientProtocol协议提交到RM端的ClientRMService内 package org.apache ...

  4. [转]Hadoop YARN任务提交流程

    Yarn是随着hadoop发展而催生的新框架,全称是Yet Another Resource Negotiator,可以翻译为“另一个资源管理器”.yarn取代了以前hadoop中jobtracker ...

  5. Yarn任务提交流程(源码分析)

    关键词:yarn rm mapreduce 提交 Based on Hadoop 2.7.1 JobSubmitter addMRFrameworkToDistributedCache(Configu ...

  6. Spark运行架构及作业提交流程

    1.yarn-cluster模式: (1)client客户端提交spark Application应用程序到yarn集群. (2)ResourceManager收到了请求后,在集群中选择一个NodeM ...

  7. hadoop2.7之作业提交详解(上)

    根据wordcount进行分析: import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; impo ...

  8. Spark:三种任务提交流程standalone、yarn-cluster、yarn-client

    spark的runtime参考:Spark:Yarn-cluster和Yarn-client区别与联系浪尖分享资料 standalone Spark可以通过部署与Yarn的架构类似的框架来提供自己的集 ...

  9. Flink(二)【架构原理,组件,提交流程】

    目录 一.运行架构 1.架构 2.组件 二.核心概念 TaskManager . Slots Parallelism(并行度) Task .Subtask Operator Chains(任务链) E ...

随机推荐

  1. mysql with python

    前言: 数据库为人类解决了三大问题:持久化存储.优化读写.数据标准化. MySQL它不是数据库,它是管理数据库的软件.MySQL管理了很多数据库.是典型的服务型数据库,需要TCP/IP去连接. MyS ...

  2. 玩点不同之CSS的BEM规范

    1.BEM引入背景 因为项目的业务逻辑发生重大变化,所以原来大半年的开发周期里做的事情基本上变成无用功.但是公司的项目上线时间依旧没有改变.剩下的时间只有区区的两个月,要做的功能是有社区+电商+核心业 ...

  3. 解决一个项目里面加载两个同名不同版本的DLL的问题

    在config里面这样配置,可以加载不同版本的dll <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com ...

  4. Sql注入基础一

    凡是带入数据库查询的都有可能是注入.     整个数据包 Sql注入原理? 网站数据传输中,接受变量传递的值未进行过滤,导致直接带入数据库查询执行的操作问题. Sql注入对于渗透的作用? 获取数据(网 ...

  5. 每个分片都是一个独立的Apache Lucene索引

    数据架构:索引+文档+文档类型+映射 [索引 文档 文档类型 映射] 索引index 对逻辑数据的逻辑存储:关系型数据库表.MongoDB集合.CouchDb数据库索引 index <---sh ...

  6. python系列八:Python3条件控制&循环语句

    #!/usr/bin/python #-*-coding:gbk-*-#Python3 条件控制&循环语句import randomage = int(input("请输入你的年龄: ...

  7. fatal error C1083: 无法打开包括文件:“stdint.h”: No such file or directory

    stdint.h是c99标准的头文件,vc不支持,所以肯定会提示“No such file or directory”的. stdint.h是C99的标准,主要用于统一跨平台数据定义. MSVC中不带 ...

  8. jquery生成二维码图片

    1.插件介绍 jquery.qrcode.min.js插件是jq系列的基于jq,在引入该插件之前要先引入jq.能够在客户端生成矩阵二维码QRCode 的jquery插件 ,使用它可以很方便的在页面上生 ...

  9. pymysql连接数据库,实现数据库增删改查

    1.数据库连接 # 创建连接 def create_conn(): import pymysql conn = pymysql.connect( host='localhost', port=3306 ...

  10. selenium屏蔽谷歌浏览器弹出的通知

    使用chromeoptions来修改浏览器的设置 from selenium import webdriver import time options = webdriver.ChromeOption ...