Yarn(Yet Another Resource Negotiator)是一个Hadoop集群资源管理系统,Hadoop2时被引入,旨在提高MapReduce的性能,但YARN已足够通用,使得它可以支持其它的分布式应用。
 
Yarn本身提供了一系列API用于用户应用程序与集群资源进行交互,这些API复杂且晦涩难懂,用户通常不会直接使用。用户编制应用程序时,通常使用的是分布式计算框架(MapReduce、Spark)提供的高层次API,这些API构建在Yarn之上且隐藏资源管理细节,如下图所示:
 
 
MapReduce、Spark、Tez这样的计算框架均以Yarn应用程序的形式运行于集群计算层(Yarn)和集群存储层(HDFS或HBase)之上,而Pig、Hive、Crunch则运行于MapReduce、Spark或Tez之上,并没有与Yarn直接交互。
 
Yarn的核心服务由两个组件提供:
 
Resource Manager:每个集群一个实例,用于管理整个集群的资源使用;
 
Node Manager:每个集群多个实例,用于自身Container的启动和监测(每个Node Manager上可能有多个Container)。
 
注:根据Yarn配置的不同,Container可能是一个Unix进程或者一个Linux cgroup实例,在受限的资源范围内(如内存、CPU等)执行特定应用程序的代码。
 
运行流程
 
 
(1)Client请求Resource Manager运行一个Application Master实例(step 1);
(2)Resource Manager选择一个Node Manager,启动一个Container并运行Application Master实例(step 2a、step 2b);
(3)Application Master根据实际需要向Resource Manager请求更多的Container资源(step 3);
(4)Application Master通过获取到的Container资源执行分布式计算(step 4a、step 4b)。
 
Application Master的具体逻辑与特定的应用相关,也许直接向Client返回计算结果,也可能请求更多的资源执行分布式计算(如step 3)。此外,Yarn本身并没有提供应用程序组件之间(Client、Master、Process)的通信实现,需要特定的应用程序自己提供,如使用Hadoop RPC。
 
资源请求
 
Yarn在资源请求方面拥有一个可扩展的模型,亦即可表述复杂的请求信息,如某个Container需要的计算资源量(内存或CPU),并可带有数据本地性约束需求。
 
数据本地性约束可以很大程度上节约分布式计算处理时的集群带宽消耗,可以表现为以下三种形式:
 
(1)请求位于集群特定节点上的Container;
(2)请求位于集群特定机架节点上的Container;
(3)请求位于集群任意节点上的Container。
 
数据本地性约束并不一定能够恰好满足,如果指定的节点无法启动新的Container(正在运行的Container已将资源耗尽),则尝试同一个机架的其它节点;如果也失败,则尝试集群中的其它节点。MapReduce场景下Map Container的分配就是这样的一种情况,通常可以粗略地认为每一个Map任务负责处理一个Block的数据,为了避免网络传输数据,应该尽可能的满足数据本地性约束,优先在存有Block Replica的节点上启动Container,次之在存有Block Replica的机架节点上启动Contaier,末之在集群中的其余节点上启动Container。
 
一个处于运行状态的Yarn应用程序可以在任何时候发起资源请求,比如应用启动时一次性请求所有资源(Spark),或者以动态的方式不断请求更多的资源满足应用的需要(MapReduce,首先请求全部的Map资源,稍后请求Reduce资源,如果某些Task失败,还会申请更多的资源用于失败恢复)。
 
应用程序生存期
 
Yarn应用程序的生存期跨度比较大:从运行几秒钟的短任务应用到运行几天甚至几月的长任务应用。相对于运行时间而言,一种更有效的方式是根据Application与Job的映射关系划分,常见以下三种情况:
 
(1)一个Application对应一个Job(MapReduce);
(2)一个Application对应一个Workflow(Session)的所有Jobs,这种方式可以在多个Jobs之间重用Containers并有效缓存中间数据(Spark);
(3)一个Long-Running  Application被多个用户共享,这种应用多数充当“Coordination”角色(Slider、Impala)。
 
构建Yarn应用程序
 
我们自己动手从头到尾构建一个Yarn应用程序是比较复杂的,很多时候也是不必要的,可以根据需要的不同选择一个优秀的分布式计算框架帮助我们构建应用程序,如需要DAG计算,则选择Spark、Tez;需要流式处理,则选择Spark、Samza或Storm。
 
也有一些开源项目帮助我们简化Yarn应用程序的构建,如Slider、Twill,目前均处于孵化器状态,暂时不讨论。Yarn本身也自带了一个例子“Distributed Shell Application”,向我们展示了如果通过Yarn Client API完成Client、Application Master与Yarn Daemons之间的交互。
 
 
 
 

Yarn应用程序运行流程剖析的更多相关文章

  1. java里的分支语句--程序运行流程的分类(顺序结构,分支结构,循环结构)

    JAVA里面的程序运行流程分三大类: 1,顺序结构:顺序结构就是依次执行每一行代码 2,分支结构:分支结构就是按不同的条件进行分支 3,循环结构:一段代码依条件进行循环执行. 其中,分支结构有两大类: ...

  2. [MapReduce_3] MapReduce 程序运行流程解析

    0. 说明 Word Count 程序运行流程解析 &&  MapReduce 程序运行流程解析 1. Word Count 程序运行流程解析 2. MapReduce 程序运行流程图

  3. IOS学习笔记1—Iphone程序运行流程

    Iphone程序运行流程 main.m文件,iOS应用程序的主入口 main函数的两个参数为命令行参数,在ios开发中不会用到这些元素,包括这两个参数是为了与标准ANSI C保持一致 UIApplic ...

  4. Python程序运行流程与垃圾回收机制

    Python程序运行流程 Python解释器首先将程序将py文件编译成一个字节码对象PyCodeObject(只存在于内存中).(当这个模块的 Python 代码执行完后,就会将编译结果保存到了pyc ...

  5. YARN应用程序开发流程(类似于MapReduce On Yarn)本内容版权归(小象学院所有)

    MapReduce On Yarn和MapReduce程序区别 MapReduce On Yarn(由专业人员开发)1 为MapReduce作业运行在YARN上提供一个通用的运行时环境2 需要与Yar ...

  6. Hadoop分布式资源管理器Yarn、MR运行机制剖析

    介绍YARN组件的功能及应用场景 1.ResourceManager(RM) RM是一个全局的资源管理器,集群中只有一个.它负责整个Hadoop系统的资源管理和分配,包括处理客户端请求.启动监控 Ap ...

  7. MFC程序运行流程

    ->进入入口函数_tWinMain() 程序首先进入文件AppModul.cpp,找到_tWinMain()函数运行,调用其中的AfxWinMain()函数. 由于为了支持UNICODE,C运行 ...

  8. .net程序运行流程

    程序员用.net开发的程序要在计算机上运行,首先程序经过编译后,会生成机器指令,一般以一个文件的形式保存,这个文件在外存储器上(存储器分外存与内存.外存:硬盘,U盘等:) 然后cpu会把硬盘上的文件读 ...

  9. C#程序运行流程

    我们写好的C#代码操作系统是如何能识别呢,我们都知道操作系统只能认识二进制 机器代码,下面用图来表示 因为C#是安全的托管代码 同时CLR会在内存中创建应用程序域 托管代码:被CLR管理的代码 非托管 ...

随机推荐

  1. Understanding Extension Class Loading--官方

    http://docs.spring.io/spring-amqp/docs/1.3.6.RELEASE/reference/html/sample-apps.html#d4e1285 http:// ...

  2. [转] git reset简介

    http://blog.csdn.net/hudashi/article/details/7664464 http://guibin.iteye.com/blog/1014369 http://hi. ...

  3. 自定义控件(视图)2期笔记08:自定义控件之 9patch图说明

    1. 何为 9patch图 ?     它是一个对png图片做处理的一个工具,能够为我们生成一个"*.9.png"的图片:所谓"*.9.png"这是Androi ...

  4. linux之CentOS-7.0环境搭建

    此文作为新手安装centos-7的图文教程.  一.  前言 最近,师兄要进行实验室架构搭建,需要学习docker.而docker是完全依赖于linux系统的.所以,有了这篇文章. linux有很多发 ...

  5. Pgsql 里面 COALESCE的用法

    有这种要求,更新自己本身的字段的某个值进行加或者减, 常规方法: UPDATE tbl_kintai_print_his SET print_time = now(), print_emp_cd = ...

  6. SQLServer2008收缩数据库日志

    -- Set to SIMPLE mode ALTER DATABASE [DATABASE_NAME] SET RECOVERY SIMPLE; -- Shrink the db ); -- Set ...

  7. Nginx反向代理配置配置实例

    为了节省支出,公司需要将分布在不同机器的站点都迁移到一台机器,而目前不同机器运行的是不同的web服务,部分是nginx,部分是apache,由于牵涉较多rewrite规则,为了节省修改功夫,打算迁移后 ...

  8. for update和for update nowait的区别和使用

    首先,for update 和for update nowait 是对操作的数据行进行加锁,在事务提交前防止其他操作对数据的修改. for update 和for update nowait主要区别在 ...

  9. Swift - 31 - 常量参数, 变量参数和inout参数

    //: Playground - noun: a place where people can play import UIKit // swift中默认情况下, 传入的参数是不可以修改的, 也就是l ...

  10. Neutron/ML2学习

    Neutron/ML2 Neutron ML2 模块层2(ml2)插件是一种允许OpenStack网络同时地利用在复杂现实数据中心发现的各种第二层网络技术的框架.目前它与存在的openvswitch. ...