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. oracle中imp命令具体解释

    oracle中imp命令具体解释 Oracle的导入有用程序(Import utility)同意从数据库提取数据,而且将数据写入操作系统文件.imp使用的基本格式:imp[username[/pass ...

  2. masonry使用介绍

    Masonry使用介绍 下面是Masonry的代码地址:https://github.com/Masonry/Masonry 介绍一个简单使用: <pre><code>[vie ...

  3. POJ 2049 Finding Nemo

    Finding Nemo Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 8631   Accepted: 2019 Desc ...

  4. 在Linux上怎么安装和配置Apache Samza

    samza是一个分布式的流式数据处理框架(streaming processing),它是基于Kafka消息队列来实现类实时的流式数据处理的.(准确的说,samza是通过模块化的形式来使用kafka的 ...

  5. 把C#对象转换为json字符串

    下面的代码写在ashx一般处理程序中 声明context.Response.ContentType = "application/json";代表服务器端返回的数据为json字符串 ...

  6. Tab页签切换

    js之tab页签切换效果       现在web网站,很多地都需要用到tab页签. 示例:         $(document).ready(function(){               va ...

  7. C#错误异常列表

    Exception: 所有异常对象的基类. SystemException:运行时产生的所有错误的基类. IndexOutOfRangeException:当一个数组的下标超出范围时运行时引发. Nu ...

  8. IOS改变状态栏样式

    1.状态栏高亮颜色 在info.plist中添加 View controller-based status bar appearance 设置为 "NO"在AppDelegate. ...

  9. socket.io实现

    后台代码 index_server.js var app = require('http').createServer(handler)//创建服务器app , io = require('socke ...

  10. html5 高清屏幕图片处理

    1. srcset 语法:在元素上添加srcset属性.srcset的值是一个用逗号分隔的列表.列表中的每个项包含一张图片的路径并且按倍数(例如,1x,2x,3x...)提供多张分辨率的图片 参考:h ...