Apache Hadoop YARN (Yet Another Resource Negotiator)是Hadoop系统的资源管理器,为各类应用程序进行资源的管理和调度。Apache HAWQ通过libyarn模块,把自己作为一个Hadoop应用,注册到YARN的Resource Manager,这样就可以与Map Reduce、Spark等其他应用一起被纳入YARN的资源管理中,由YARN统一对资源进行管理和调度。本文将简单介绍HAWQ libyarn模块的基本原理和功能。
YARN的基本设计思想是将MapReduceV1中JobTracker的两个主要功能——资源管理和作业调度拆分成两个独立的服务:一个全局的资源管理器Resource Manager和多个针对Hadoop应用的Application Master。ResourceManager负责整个Hadoop系统中所有应用的资源管理和分配,每个应用对应一个Application Master实例,负责相应的调度和协调。每个节点上有一个Node Manager实例,监控应用程序的资源使用情况,并且向Resource Manager汇报,以及负责处理来自Application Master启动或停止container的请求。容器container是YARN对资源的一种抽象,可以看做资源分配的单位。
HAWQ的资源管理有NONE和YARN两种模式,可以在hawq-site.xml中进行配置:
当HAWQ运行在NONE模式下,HAWQ会独占集群的资源,对各节点的资源进行调度和分配;当运行在YARN模式下,HAWQ会把自己当做Hadoop应用,与YARN的Resource Manager协调申请、释放资源。HAWQ的libyarn模块,从本质上讲,是类似hadoop-yarn Java版的C++实现。HAWQ通过使用libyarn所提供的接口,创建一个Unmanaged Application Master实例,与YARN的全局Resource Manager以及各个节点的Node Manager进行交互,从而实现应用程序的注册、资源的申请与释放等各项功能。
接下来讲一下HAWQ是怎样通过Libyarn接口,完成注册、申请/释放资源。Libyarn接口定义可以参考HAWQ代码中LibYarnClient.h文件(/depends/libyarn/src/libyarnclient/LibYarnClient.h)
应用启动后,首先需要通过调用createJob函数向Resource Manager注册自己,只有注册成功后,才有资格向RM申请资源。
如果createJob调用成功,一个独立的心跳线程会被创建并且定时向Resource Manager发送心跳RPC汇报自己状态。
应用申请资源时,调用addContainerRequests函数指明所需container的个数以及优先级等信息,然后调用allocateResources函数向Resource Manager申请资源。
应用申请资源成功后,调用activeResources函数向资源所在的各个节点NodeManager发送active container的请求。
在应用运行过程中,可以调用getContainerStatuses函数向NodeManager获取该节点上的container的状态信息;或者调用getContainerReports函数向ResourceManager获取container报告。
资源使用完毕,应用的Application Master需要调用releaseResources释放资源。
当应用运行结束,调用finishJob函数向RM注销自己。
目前libyarn模块已经支持Kerberos安全协议和HA,用户可以根据应用的需求在yarn-client.xml文件中配置,具体配置请参考HAWQ用户手册。
Hadoop YARN的HA功能是利用ZooKeeper,配置一个Standby Resource Manager,如果配置自动Failover功能,当Acitve Resource Manager发生故障停止运行时,Standby Resource Manager会自动切换成Active。在HAWQ中,Application Master调用libyarn接口发现经过若干次(次数可以在yarn-client.xml配置)尝试连接不到ActiveRM时,会自动尝试连接StandbyRM,直到成功。