写点什么

YARN Federation 技术解析及应用

  • 2022 年 5 月 24 日
  • 本文字数:3335 字

    阅读完需:约 11 分钟

文章主要介绍了 YARN Federation 技术架构、实现原理以及在中国移动项目中的应用和思考。

一、背景

YARN 计算扩展能力由 ResouceManager(以下简称 RM)决定,与节点数、运行作业数、运行容器数以及集群内心跳间隔强关联。目前我们项目上用的最大集群为 4K+节点。

YARN Federation 架构与 HDFS Federation 的架构有点相似,使用联邦模式,将多个 YARN 集群联合成一个超大 YARN 集群,可以将 YARN 集群扩展至数万计算节点。每个子 YARN 集群都有自己 RM 和计算节点。对用户屏蔽了底层集群存在,用户见到的是一个超大 YARN 集群,可以在联合集群上进行提交作业。而在实际底层,联合系统与各子集群 RM 进行协商,为作业提供计算资源,允许作业跨集群运行。

联邦层设计在当前 YARN 架构之上,对当前 YARN 核心机制修改较小。同时因为子集群间没有交互,我们可以简单扩展子集群来对集群计算能力进行水平扩展。若单个子集群故障全部下线,联合系统可以将任务重启调度到其他子集群,以确保任务的正常运行。

二、技术架构

YARN Federation 联邦层主要实现以下两大功能:1)子集群状态信息收集,存储 2)客户端请求路由服务实现。

底层核心修改用于跨集群运行作业功能。

以下为 YARN Federation 的架构设计图:

下面介绍一下各个组件:

1)SubCluster

SubCluster 就是设计中的 YARN 子集群,一般子集群要具有高可用性,即可以容忍 RM,NM 宕机,实现伤害最小化。如果一个子集群整个挂掉,联邦机制应该保证这个子集群上的作业被重新提交到另一个子集群上。在联邦集群里,子集群是一个扩展单位。我们可以通过添加一个或者多个联邦来扩展一个联邦集群。而且,各自独立的子集群可以决定是否并入联邦系统,贡献出自己一部分的资源

2)Router

Router 为联邦架构下对外提供服务的接口,实现了 ApplicationClientProtocol 担当了以前 RM 的角色,屏蔽了底层多个子集群 RMs 的存在。对客户端的请求进行转发,根据策略将请求转发至子集群。该组件是无状态的,一个 Federation 集群可以配置一组,但最少配置一个。用户提交应用时首先会访问其中一个 Router,然后 Router 会先从 State Store 中获得所有子集群信息(active rm 和 其他一些使用率信息),之后根据配置的路由策略将应用程序提交请求转发到对应的 RM 上。一个作业在哪一个子集群中启动,这个子集群就被称为该作业的"home sub-cluster",其它子集群都是该作业的"secondary sub-cluster"。 

3) StateStore

Federation 集群状态存储组件,其中主要记录了所有 sub-cluster 的信息。目前提供了 Memory、MySQL、Zookeeper 几种存储实现,可以根据自己的场景选择一种。一般使用 Zookeeper 存储。

4) AMRMProxy

AMRMProxy 是保证应用可以跨子集群运行的关键组件,充当应用程序和多个 RM 通讯的桥梁。AMRMProxy 会在每个 NM 上启动,实现了 ApplicationMasterProtocol,充当 AM 向 RM 的代理。YARN Federation 架构应用不允许和子集群中的 RM 直接通信,应用被限定只能与 AMRMProxy 通信,以此来实现多 RMs 的透明访问。

5) PolicyStore

路由策略存储组件,其中主要包含应用程序和资源请求如何路由到不同子集群的策略。目前的实现提供了多种策略,从 hashing、loadbased、weighted、priority 到更复杂的策略,这些策略包含子集群负载和本地化需求。

6) Global Policy Generator

全局策略生成器(GPG)会持续观测整个联邦系统,确保其配置合理性。设计中不要求 GPG 始终开启,可以更加准确地更新用户在子集群上的容量影射表,并且更加准确地更新 Router,AMRMProxy 甚至 RMs 中的策略。该特性暂未实现,初始实现代码已从 trunk 中删除(YARN-3657)。

三、跨集群运行应用程序组件间交互

当一个应用被提交到联邦集群时,Router 会决策哪一个子集群最适合做这个应用的 home sub-cluster。作业的 ApplicationMaster(以下简称 AM)和 RM 之间的所有通信都会通过该 AM 所在主机的 AMRMProxy 进行。

AMRMProxy 向外暴露 ApplicationMasterService 协议来充当 YARN RM。AM 可以根据从本地存储层获得的本地信息来请求 containers。在理想的场景下,应用只要向它的 home-sub-cluster 请求资源就可以了,但是,如果该应用需要向其他子集群请求资源,AMRMProxy 会与那些子集群进行交互,并且为该应用申请资源。因此,应用可以向整个联邦系统请求资源。所有这些透明的操作都是通过协调 AMRMProxy,GPG 和 Router 来完成的。

下图展示这几个组件之间是如何交互的。

1.Router 接收到一个通过 YARN Application Client Protocol 提交的应用请求。

2.Router 通过查询路由(策略)表来为该应用选择一个"home RM"。

3.Router 访问 statestore 来确定该 home RM 的地址

4.Router 将应用提交请求重定向到 home RM。

5.Router 将包含 home RM 标识的应用状态信息保存到 statestore 中

6.当应用被提交到 home RM 上时,作业的执行流程就开始了。例如,应用会被提交到调度器队列上,它的 AM 会在 home-sub-cluster 上的第一个有足够资源的 Nodemanager 上被启动。      a. 在这个过程中,AM 的执行环境中会加入 AMRMProxy 的地址,以便和之后的 YARN RM 进行通信。     b. AM 的安全令牌也会被修改,这样,AM 就只能和 AMRMProxy 通信。之后 AM 和 RM 之间的一切通信都由 AMRMProxy 来完成。

7.AM 根据 HDFS 上的本地信息来申请 containers

8.AMRMProxy 可以基于某种策略,扮演成 AM 在其它子集群上启动一个 Unmanaged AM,并且向两个子集群同时汇报集群。

9.AMRMProxy 会同时根据本地信息和从 GPG 获得的调度策略来决定是从 home-sub-cluster 还是从 secondary sub cluster 来请求资源。在上图中,AMRMProxy 就是决定向 Secondary sub cluster 来请求资源。

10.Secondary RM 为 AMRMProxy 提供有效的 container 令牌来在该 RM 集群上启动一个 container。这样一来,每个 sub-cluster 都可以保证只使用到自己的安全令牌,从而避免需要一个全局的产生令牌的组件

11.AMRMProxy 把资源被分配的响应传回给 AM。

12.AM 使用标准的 YARN 协议在目标 Nodemanager(在 sub-cluster2)上启动 container。

四、YARN Federation 在移动项目中的应用

背景

项目中,初始规划了 Hive、Flink、HBase 等多套隔离的 Hadoop 集群。在实际使用过程中,发现往往存在有的集群业务繁忙计算资源不够用,有的集群计算资源空闲,这些都是阶段性的,一般通过下线节点迁移至其他集群来进行解决,频繁迁移动作较大,故引入 YARN Federation 特性,实现计算资源充分利用。

方案

1.多套集群同一套 Kerberos 认证,避免 Kerberos 互信的维护 2.定制化开发 TargetQueueRouterPolicy 路由策略,基于 YARN 队列名提供独占和共享两种类型的队列。独占队列则根据队列名将作业调度至指定的集群,共享队列则复用 LoadBasedRouterPolicy 将作业调度至计算资源较为富裕的集群。实现计算资源的充分利用

部署架构

应用效果

•综述页面

•联邦页面

遇到的问题

1)应用页面至显示 router 所在集群应用,未显示所有子集群应用

原因:YARN.router.webapp.interceptor-class.pipeline 配置需要配置为 org.apache.hadoop.YARN.server.router.webapp.FederationInterceptorREST

2)Kerberos Token 跨集群认证失败问题

现象:使用租户票据在一个集群向另一个集群提交作业,会出现 Kerberos 认证失败的情况

原因:多个集群底层 HDFS 存储所缓存的 Token 不在同一个地方,将多个 HDFS 集群的 Token 指向统一地址,问题修复。对应配置为 zk-dt-secret-manager.zkConnectionString 与 zk-dt-secret-manager.znodeWorkingPath

3)Flink 作业提交失败

原因:对于开启 YARN Federation 的集群,flink 的配置中需要配置 YARN.security.kerberos.additionalFileSystems 配置,改配置的值为所有子集群 hdfs 的 nameservice,且需要以分号分隔而非逗号。

总结和思考

1.AMRMProxy 的功能特性导致 YARN Fedration 开启后,无法独立使用子集群。如何两者兼得,在子集群贡献部分算力的同时,能够独立作为一个集群运行。

2.当前路由调度的策略为全局的,全局只能使用一种调度策略。如何像 HDFS Router 一样为每个队列配置其个性化策略。

3.当前 YARN Federation 集群的队列配置,需要至各个子集群进行独立配置,队列资源的配置能否提升至 Router 层进行统一管理。

4.官方 Global Policy Generator(GPG)全局策略调度器功能的实现,如何保障全局调度最优化。

参考链接

•Hadoop 官网:https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/Federation.html

•Hadoop JIRA 设计文档:https://issues.apache.org/jira/browse/YARN-2915

用户头像

移动云,5G时代你身边的智慧云 2019.02.13 加入

移动云大数据产品团队,在移动云上提供云原生大数据分析LakeHouse,消息队列Kafka/Pulsar,云数据库HBase,弹性MapReduce,数据集成与治理等PaaS服务。 微信公众号:人人都学大数据

评论

发布
暂无评论
YARN Federation技术解析及应用_YARN_移动云大数据_InfoQ写作社区