12.3.3 Apache YARN设计细节

Apache YARN在系统架构和软件设计等方面和MRv 1相比都有明显的改进。在前几节中,我们已经介绍了它的全新系统架构,而在本小节中,我们重点从软件设计和资源调度模型两方面介绍其采用的关键技术:在软件设计方面,YARN采用了基于服务的对象管理模型和基于事件驱动的并发模型;而在资源调度模型方面,YARN采用了更为细粒度的基于真实资源需求量的调度模型。

1.基于服务的对象管理模型

对于生命周期较长的对象,YARN采用了基于服务的对象管理模型对其进行管理。该模型主要有以下几个特点。

❑将每个被服务化的对象分为4个状态:NOTINITED(被创建)、INITED(已初始化)、STARTED(已启动)、STOPPED(已停止)。

❑任何服务状态变化都可以触发另外一些动作。

❑可通过组合的方式对任意服务进行组合,以便进行统一管理。

YARN中关于服务模型的类图如图12-8所示。在这个图中,我们可以看到,所有的服务对象最终均实现了接口Service,它定义了最基本的服务初始化、启动、停止等操作,而AbstractService类则提供了一个最基本的Service实现。YARN中所有对象,如果是非组合服务,则直接继承AbstractService类即可,否则需继承CompositeService。比如,对于ResourceManager而言,它是一个组合服务,它组合了各种服务对象,包括ClientRMService、ApplicationMasterLauncher、ApplicationMasterLauncher等。

12.3.3 Apache YARN设计细节 - 图1

图 12-8 YARN中服务模型的类图

2.基于事件驱动的并发模型

YARN采用了基于事件驱动的并发模型。该模型能够大大增强并发性,从而提高系统整体性能。为了构建该模型,YARN将各种处理逻辑抽象成事件和对应事件调度器,并将每类事件的处理过程分割成多个步骤,用有限状态机表示。YARN中的事件处理模型如图12-9所示。

12.3.3 Apache YARN设计细节 - 图2

图 12-9 YARN的事件处理模型

整个处理过程大致为:处理请求会作为事件进入系统,由中央调度器(AsyncDispatcher)负责传递给相应事件调度器(Event Handler),该事件调度器可能将该事件转发给另外一个事件调度器,也可能交给一个带有有限状态机的事件处理器;其处理结果也以事件的形式输出给中央调度器,而新的事件会再次被中央调度器转发给下一个事件调度器,直至处理完成(达到终止条件)。

3.基于真实资源需求量的调度模型

不同于MRv 1中基于slot的资源模型,YARN采用了基于真实资源需求量的调度模型:集群中各个节点周期性向ResourceManager汇报各类资源使用情况(如CPU、内存等),而ResourceManager则根据各个作业的真实资源量需求,结合一些资源约束,进行资源分配和任务调度。

用户提交应用程序后,对应的ApplicationMaster负责将应用程序的资源需求转化成符合特定格式的资源请求,并发送给ResourceManager。一旦某个节点出现空闲资源,ResourceManager中的调度器将决定把这些空闲资源分配给哪个应用程序,并封装成Container返回给对应的ApplicationMaster。

ApplicationMaster发送的资源请求形式如下:


<Priority, Hostname, Resource,#Container>


上述的形式中涉及的几个属性的含义分别如下。

❑Priority:资源优先级。不同于MRv 1中的优先级概念(只有5种优先级,且难以扩展),YARN允许优先级是任意正整数,而具体怎样规划各种资源的紧急程度,完全由应用程序的ApplicationMaster决定。比如YARN自带的MapReduce框架的ApplicationMaster将资源分为三种优先级,分别是PRIORITY_FAST_FAIL_MAP(运行失败Map Task Attempt所需资源的优先级)、PRIORITY_REDUCE(Reduce Task所需资源的优先级)和PRIORITY_MAP(Map Task所需资源的优先级),优先级分别是5、10和20(Priority对应的数值越小,优先级越高)。ResourceManager将优先为优先级高的任务分配资源。

❑Hostname:期望分配的资源所在节点。调度器会优先为应用程序分配满足数据本地化的资源,这样可避免移动数据从而提高效率。而根据数据本地化的三个级别(Node-local、Rack-local和Off-switch),该属性有三个可选值:资源所在节点,资源所在机架和“”。其中,“”表示可在任何节点上。

❑Resource:表示需要的资源量。截至2.0.3-alpha版本,YARN仅支持CPU和内存两种资源[1]

❑#Container:需要符合以上资源描述(优先级、所在节点和资源需求三方面的需求)的Container的数量。对于MapReduce而言,同一个作业的所有同类型任务需要的资源量是相同的。

【实例】“<10,nodeX, memory:2GB|CPU:1,2>”表示请求2个满足以下条件的优先级为10的Container:位于节点nodeX上、2 GB内存、1个CPU,这两个Container的优先级均为10。这意味着,如果没有优先级更高的Container需求,则需要优先分配这2个Container。

如果ApplicationMaster获取到了新资源,它会收到一个Container列表,其中每个Container主要包含以下内容:


<ContainerId, NodeId, NodeHttpAddress, Resource, ContainerToken>


当收到一个ID为ContainerId的Container后,ApplicationMaster将与ID为NodeId的NodeManager通信,并使用ContainerToken进行安全认证,以要求它启动一个占用Resource资源量的Container,在该Container中启动任务。与MRv 1只能够启动Java应用程序不同,YARN允许启动任意进程,比如Shell脚本、PHP进程、Python进程等。

[1]https://issues. apache.org/jira/browse/YARN-2