随着Hadoop 成为大数据处理的一个基础组件之后,各大公司都使用Hadoop做大数据平台的底层。但是随着集群规模的增长与业务量的激增会遇到很多瓶颈。其中最显著的缺点是在早期的(Hadoop  2.9 之前 )Hadoop版本中,ResourceManager这个组件会限制你集群的规模。一般到6000节点以上YARN 的调度(Container资源分配)就成为集群的瓶颈。为了解决这个问题,社区推动了YARN Federation (YARN-2915)机制来解决这个问题。

1

一、 YARN Federation 逻辑结构

YARN Federation的主要设计思想是希望通过联合的方式让集群可以有多个SubCluster 。 每个SubCluster都是一个独立的小集群,由子集群的ResourceManager分别管理一部分节点。这些小集群共同组成一个大的YARN Federation集群,实现资源的统一管理与作业调度。

感谢官方配图(1)

通过上图我们可以看出在这个机制中增加了如下几个组件:

State Store:  Federation集群状态存储组件,其中主要记录了所有sub-cluster的信息。目前提供了memory, mysql, zookeeper 几种存储实现,可以根据自己的场景选择一种。

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

Router: 路由组件,一个Federation 集群可以配置一组,但最少配置一个。用户提交应用时首先会访问其中一个Router,然后Router会先从State Store中获得所有“Sub Cluster”信息(active rm 和 其他一些使用率信息),之后根据配置的路由策略(稍后介绍)将应用程序提交请求转发到对应的RM上。

AMRMProxy: AMRMProxy是应用程序和多个RM通讯的桥梁。他允许一个App可以跨子集群运行,即一个App有2000个task, 这些task会分散到所有子集群上运行,每个子集群运行一部分。 AMRMProxy运行在所有的NM机器上,它实现了ApplicationMasterProtocol接口作为AM的YARN RM的代理。 应用程序不能直接与子集群的RM通信。 YARN框架强制应用程序只能连接到AMRMProxy,从而提供对多个YARN RM(通过动态路由/拆分/合并通信)的透明访问。 在任何时候,作业都可以跨主子集群和多个辅助子集群运行,其中AMRMProxy的运行策略会试图限制每个作业的占用空间以降低调度上的开销(更多关于可伸缩性 /负载)。 ARMMProxy的结构如下图:

3

感谢官方配图(2)

二、应用程序跨Sub-Clusters运行流程

提交应用程序时,Router会找一个最合适的子集群运行应用程序,称之为应用程序的主子集群。 AM与RM的所有通信都通过AM机器本地的AMRMProxy进行。   理想情况下,应用程序默认会运行在资源和数据都可用的子集群上,但如果需要其他子集群节点上的资源,则AMRMProxy将与这个子集群的RM通讯请求资源。让应用程序像在一个大集群上运行。 这个功能需要AMRMProxy,全局策略生成器(Global Policy Generator,GPG)和Router组合在一起使用。

4

感谢官方配图(3)

官方对这个流程的描述如下:

三、安装与体验

笔者花了一些时间搭建测试这个功能,使用的版本为Hadoop 3.0.0-beta1  ,发现如下几个缺陷:

  1. 1.Router WebUI 界面部分信息不全,有些值并没有提供,如Applications Submitted、Pending、Running等信息(见下面二个图)

5

6

2. Router 上的FederationClientInterceptor(Federation客户端消息拦截器,实现向RM发送消息的代理)只实现了目前只实现了4个接口,如果你在客户端上执行yarn applicaiton -list 刚会报如下错误:

7

代码中描述只实现了4个调用getNewApplication, submitApplication, forceKillApplication and getApplicationReport .如果你使用诸如yarn application -list 这样的命令开发了一个工具,那么肯定会出问题。目前可以先将这些工具指向具体的RM解决(修改 yarn.resourcemanager.address)。

3. 相关UI图片预览

8

Federation界面

10

Nodes 界面

9

Applicaitons 界面

作业如果跨子集群运行,那么他在每个RM上都会有一作业描述信息,唯一不同的是在辅助子集群上的作业名为UnmanagerAM-c1 这种类似的名字,真正的AM只有一个并在主子集群内运行。

总结:

整个搭建过程所需要的配置项还是比较多的,如果配置错误会导致Router界面启动不了或无法访问。另外目前Hadoop-3.0.0 版本还无法在生产环境中使用,建议测试学习使用。

附录(配置描述):

| 子集群 | 角色 | 编号 | 地址 |
| ——-| —– | ——- | ————– |
| c1 | rm | c1-rm1 |hostname-rm1 |
| c2 | rm | c2-rm1 | hostname-rm2 |
| c1 | nm | c1-nm1 | hostname-nm1 |
| c2 | nm | c2-nm1 | hostname-nm2 |
| c1,c2 | jh | jh | history-host |
| c1,c2 | hdfs | hdfs | hdfs-host|
| c1,c2 | router| router1 | router-hostname|
| c1,c2 | client| client1 | clisnt-hostname |

Router 节点配置

yarn-site.xml

 

ResourceManager 1节点配置

yarn-site.xml

ResourceManager 2节点配置

NM 1节点配置

yarn-site.xml

mapred-site.xml

 

NM2 节点配置

yarn-site.xml

mapred-site.xml

 Client 节点配置

yarn-site.xml

mapred-site.xml