Yarn 基础详解

Posted 大数据每日哔哔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Yarn 基础详解相关的知识,希望对你有一定的参考价值。


阅读文本大概需要 5 分钟。

我们先来看看 MRV1 版本的时候,资源是如何调度管理的?


MRV1 如下图,大型的 Hadoop 集群出了由单个 JobTracker 导致的可伸缩性瓶颈。由于此限制,必须创建和维护更小的、功能更差的集群。



如上图,可以看出 JobTracker 具有两种不同的职责:


  • 管理集群中的计算资源,这涉及到维护活动节点列表、可用和占用的 map 和 reduce slots 列表,以及依据所选的调度策略将可用 slots 分配给合适的作业和任务

  • 协调在集群上运行的所有任务,这涉及到指导 TaskTracker                    启动 map 和 reduce 任务,监视任务的执行,重新启动失败的任务,推测性地运行缓慢的任务,计算作业计数器值的总和,等等


为单个进程安排大量职责会导致重大的可伸缩性问题,尤其是在较大的集群上,JobTracker 必须不断跟踪数千 TaskTracker、数百个作业,以及数万个 map 和 reduce 任务。下图演示了这一问题。相反,TaskTracker 通常近运行十来个任务,这些任务由勤勉的 JobTracker 分配给它们。


Yarn 基础详解


接下来,Yarn 要登场了。


于是,Hadoop 2.0新引入的资源管理系统,直接从MRv1演化而来的;将MRv1中JobTracker的资源管理和任务调度两个功能分开,分别由ResourceManager和ApplicationMaster进程实现。


ResourceManager:负责整个集群的资源管理和调度。

ApplicationMaster:负责应用程序相关的事务,比如任务调度、任务监控和容错等。


它就是 Yarn。


Yarn 的基本思想是将资源管理和作业调度/监视功能拆分为单独的守护进程。其想法是拥有一个全局资源管理器(RM)和每个应用程序应用程序主控器(AM)。应用程序可以是单个作业,也可以是一个DAG作业。


Yarn 基础详解


分工更加明细了,注意这里出现了 RM, AM, NM 他们分别发挥着什么作用呢?


在 YARN 架构中,一个全局 ResourceManager 以主要后台进程的形式运行,它通常在专用机器上运行,在各种竞争的应用程序之间仲裁可用的集群资源。ResourceManager 会追踪集群中有多少可用的活动节点和资源,协调用户提交的哪些应用程序应该在何时获取这些资源。ResourceManager 是惟一拥有此信息的进程,所以它可通过某种共享的、安全的、多租户的方式制定分配(或者调度)决策(例如,依据应用程序优先级、队列容量、ACLs、数据位置等)。


在用户提交一个应用程序时,一个称为 ApplicationMaster 的轻量型进程实例会启动来协调应用程序内的所有任务的执行。这包括监视任务,重新启动失败的任务,推测性地运行缓慢的任务,以及计算应用程序计数器值的总和。这些职责以前分配给所有作业的单个 JobTracker。ApplicationMaster 和属于它的应用程序的任务,在受 NodeManager 控制的资源容器中运行。


NodeManager 是 TaskTracker 的一种更加普通和高效的版本。没有固定数量的 map 和 reduce slots,NodeManager 拥有许多动态创建的资源容器。容器的大小取决于它所包含的资源量,比如内存、CPU、磁盘和网络 IO。


接下来,分析一个任务提交的流程,加深我们队 Yarn 资源调度框架的理解。


Client 将应用程序提交到 ResourceManager。ResourceManager 维护着集群上运行的应用程序列表,以及每个活动的 NodeManager 上的可用资源列表。ResourceManager 需要确定哪个应用程序接下来应该获得一部分集群资源。该决策受到许多限制,比如队列容量、ACL 和公平性。

ResourceManager 使用一个可插拔的 Scheduler。Scheduler 仅执行调度;它管理谁在何时获取集群资源(以容器的形式),但不会对应用程序内的任务执行任何监视,所以它不会尝试重新启动失败的任务。

在 ResourceManager 接受一个新应用程序提交时,Scheduler 制定的第一个决策是选择将用来运行 ApplicationMaster 的容器。在 ApplicationMaster 启动后,它将负责此应用程序的整个生命周期。首先也是最重要的是,它将资源请求发送到 ResourceManager,请求运行应用程序的任务所需的容器。资源请求是对一些容器的请求,用以满足一些资源需求,比如:一定量的资源,目前使用 MB 内存和 CPU 份额来表示,一个首选的位置,由主机名、机架名称指定,或者使用 * 来表示没有偏好,此应用程序中的一个优先级,而不是跨多个应用程序。

如果可能的话,RM 会分配一个满足 ApplicationMaster 在资源请求中所请求的需求的容器(表达为容器 ID 和主机名)。该容器允许应用程序使用特定主机上给定的资源量。分配一个容器后,ApplicationMaster 会要求 NodeManager(管理分配容器的主机)使用这些资源来启动一个特定于应用程序的任务。此任务可以是在任何框架中编写的任何进程(比如一个 MapReduce 任务)。

NodeManager 不会监视任务;它仅监视容器中的资源使用情况,举例而言,如果一个容器消耗的内存比最初分配的更多,它会结束该容器。

ApplicationMaster 会竭尽全力协调容器,启动所有需要的任务来完成它的应用程序。它还监视应用程序及其任务的进度,在新请求的容器中重新启动失败的任务,以及向提交应用程序的客户端报告进度。应用程序完成后,ApplicationMaster 会关闭自己并释放自己的容器。

尽管 ResourceManager 不会对应用程序内的任务执行任何监视,但它会检查 ApplicationMaster 的健康状况。如果 ApplicationMaster 失败,ResourceManager 可在一个新容器中重新启动它。您可以认为 ResourceManager 负责管理 ApplicationMaster,而 ApplicationMasters 负责管理任务。

不知道你们注意到没有?图中的 ResourceManager 都是单节点的。在实际中并不是单节点存在的,但是同一时刻只有一个节点在服务,另一个是 HA,作为主 RM 的备灾。

理解它的 HA 配置原理不难。

ResourceManager HA是通过/standby体系结构实现的-在任何时间点,其中一个RMS处于活动状态,并且一个或多个RMS处于待机模式,等待在active的RM发生任何故障时接管。


正常情况下,发生故障是,会进行自动切换,如果需要手动切换的时候,可以使用命令 yarn rmadmin 把现在的 active 状态的 RM 切换成待命状态,然后在其他一台 standby 状态的机器上,执行 yarn rmadmin 来唤醒到 active 状态。


自动切换的原理和NameNode HA 故障转移的原理一致。大家可以看这篇文章复习一下:


在这里也简单说一下,RM 可以选择嵌入基于ZooKeeper的ActiveStatandByElector来决定哪个RM应该是活动的。当活动停止或无响应时,会自动选择另一个RM作为活动RM,然后由该RM接管。注意,没有必要像hdfs那样运行单独的zkfc守护进程,因为嵌入在rms中的activestandbyelector充当故障检测器和引导选择器,而不是单独的zkfc守护进程。


下面是 Ha 的配置示例,yarn-site.xml


<property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value></property><property> <name>yarn.resourcemanager.cluster-id</name> <value>cluster1</value></property><property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value></property><property> <name>yarn.resourcemanager.hostname.rm1</name> <value>master1</value></property><property> <name>yarn.resourcemanager.hostname.rm2</name> <value>master2</value></property><property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>master1:8088</value></property><property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>master2:8088</value></property><property> <name>yarn.resourcemanager.zk-address</name> <value>zk1:2181,zk2:2181,zk3:2181</value></property>


(完)

以上是关于Yarn 基础详解的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop Yarn 一文搞懂 Yarn架构原理和工作机制

DOM探索之基础详解——学习笔记

Hadoop新MapReduce框架Yarn详解

Node入门教程第五章:node 模块化(下) npm与yarn详解

YARN详解

yarn详解