HA总览:Zookeeper、HDFS、YARN
一、HDFS-HA架构
-
NameNode
:ActiveNode
和StandbyNode
形成互备,当Active
挂掉的时候启动Standby
作为Active
对外提供服务。 -
ZKFailoverController
作为独立的进程运行,对NameNode
的主备切换进行总体控制。ZKFailoverController
能及时检测到NameNode
的健康状况,在主NameNode
故障时借助Zookeeper
实现自动的主备选举和切换。 -
共享存储系统:主
NameNode
和备份NameNode
实现元数据同步的关键,新的NameNode
只有在确认元数据完全同步后才能继续对外提供服务。 -
DataNode
节点:除了同步元数据之外,还需要同步hdfs
数据块和datanode
的映射关系,DataNode
会向主NameNode
和备份NameNode
上报数据块的位置信息。 -
Zookeeper
集群:为主备切换控制器提供主备选举支持。
JournalNode
JournalNode
用来存放editlog
。
active
状态的NameNode
的命名空间有任何改动时,会通知大部分JournalNode
进程并写入editlog
中。
Standby Namenode
读取JournalNodes
中的变更信息,并监控editlog
的变化,从editlog
中读取实现数据同步,再把变化应用于自己的命名空间。standby
可保证在集群出错时,命名空间状态已经完全同步了。
JournalNodes
是非常轻量级的,可部署在其他机器上,必须至少三个节点,奇数个。
HDFS高可用切换的核心:ZKFC
ZKFailoverController
作为独立的进程运行,对 NameNode
的主备切换进行总体控制。ZKFailoverController
能及时检测到 NameNode
的健康状况,在主 NameNode
故障时借助 Zookeeper
实现自动的主备选举和切换。
-
HealthMonitor
:主要负责检测NameNode
的健康状态,如果检测到NameNode
的状态发生变化,会回调ZKFailoverController
的相应方法进行自动的主备选举。主要是磁盘存储资源是否充足。 -
ActiveStandbyElector
:主要负责完成自动的主备选举,内部封装了Zookeeper
的处理逻辑,一旦Zookeeper
主备选举完成,会回调ZKFailoverController
的相应方法来进行NameNode
的主备状态切换。
ZKFailoverController
:协调HealthMonitor
和ActiveStandbyElector
对象,处理它们发来的event
变化事件,完成自动切换的过程。
二、YARN-HA架构
集群概述:
RM
(ResourceManager
):一个集群只有一个active
状态的,负责整个集群的管理和调度
- 处理客户端请求
- 启动监控
ApplicationMaster
(AM
:一个作业对应一个) - 监控
NodeManager
- 系统资源的分配和调度
NM
(NodeManager
):负责单个节点的资源管理和使用以及task
运行
- 定期向
RM
汇报本节点的资源使用情况和container
运行情况 - 接收处理
RM
对container
的启停各种命令 - 单节点资源管理和任务管理
Zookeeper
在ZooKeeper
上会有一个/yarn-leader-election/yarn1
的锁节点,所有的ResourceManager
在启动的时候,都会去竞争写一个Lock
子节点:/yarn-leader-election/yarn1/ActiveBreadCrumb
,该节点是临时节点。ZooKeepr
能够为我们保证最终只有一个ResourceManager
能够创建成功。创建成功的那个ResourceManager
就切换为Active
状态,没有成功的那些ResourceManager
则切换为Standby
状态。
ZKFC
ZKFC
:是RM
里面的一个线程,在HDFS HA
中,ZKFC
是一个独立的进程。作用 是监控RM
的健康状态,并执行选举作用。
RMStateStore
RM
会把job
的信息存放在zookeeper
的/rmstore
目录下,active RM
会向这个目录写app
的信息。当active RM
挂掉之后,standby RM
会通过zkfc
切换为active
状态,然后从zookeeper
的/rmstore
目录下读取相应的作业信息。重新构建作业的内存信息,启动内部服务,开始接受NM
的心跳信息,构建集群的资源信息,并且接受客户端的作业提交请求。
三、HDFS的NameNode和YARN的ResourceManager之间的关系
在所有的HDFS
和YARN
的框架介绍中,没有具体介绍这两个框架的整合使用。也没有一张图来表明两个框架之间的分工合作。
对于HDFS
的NameNode
和YARN
的ResourceManager
之间的关系也很模糊。在集群搭建的时候,有节点启动了HDFS
,有节点启动了YARN
,这两者之间的关系和协同工作由下图来描述。
Hadoop
提供的服务,主要是两个:分布式存储、分布式计算。
分布式就是由多台机器协同来完成的任务。
Hadoop
的分布式系统,都采用Master-Slave
的主从模式,在这样的模式下,分布式存储系统(HDFS
)的主节点,是NameNode
。分布式资源管理系统(Yarn
)的主节点,是ResourceManager
。
可以把Hadoop
想象成单机操作系统扩展到一个集群的情况,其中的NameNode
就是文件系统的中央管理枢纽,ResourceManager
就相当于单机中负责管理机器中的内存、cpu
的那个操作系统的调度系统。
其实这两个框架谈不上什么分工协作的。 HDFS
可以理解为像个文件系统,YARN
可以理解为像个shell
。 从设计的初衷上,二者就没什么分工协作, 说得更专业点,叫"耦合度低"。假设我们写一个MRv2(yarn
)的简单程序,如果输入输出都不是HDFS
路径,而是本地硬盘路径(local
)的话,那这个程序跟hdfs
可能就完全没有关系了。