hdfs&&yarn HA 详解

在这里插入图片描述
HA进程: 3台机器
hadoop001:ZK NN ZKFC JN DN

hadoop002:ZK NN ZKFC JN DN

hadoop003:ZK JN DN

ZK集群2n+1个。
根据经验值,20台节点布置5台zk,20~100布置7/9/11台,>100台布置11台。
各角色功能介绍:
NameNode:集群当中的主节点,主要用于管理集群当中的各种数据,一般都是使用两个,实现HA高可用。
ACTIVE NN: 操作记录写到自己的editlog,同时写JN集群, 接收DN的心跳和块报告。
STANDBY NN: 同时接收JN集群的日志,显示读取执行log操作(重演), 使得自己的元数据和active nn节点保持一致。接收DN的心跳和块报告
JournalNode:元数据信息管理进程,一般都是2n+1个,同步元数据,通过JN共享状态。(当记录成功写入集群中的大数节点时,才认为成功。就是说写入成功的节点数>n+1/2)
DataNode:从节点,用于数据的存储,同时向NN1 NN2发送心跳和块报告。
ZKFC(zookeeperfailovercontrol):单独的进程,监控NN监控健康状态,向zk集群定期发送心跳,使得自己可以被选举;当自己被zk选举为active的时候,zkfc进程通过RPC协议调用使NN节点的状态变为active,对外提供实时服务,是无感知的。


YARN HA

hadoop001:zk rm(zkfc) nm
hadoop002:zk rm(zkfc) nm
hadoop003:zk nm

ZKFC: 线程
只作为RM进程的一个线程而非独立的进程存在

RMStateStore:
存储在zk的/rmstore目录下。
1.activeRM会向这个目录写APP信息
2.当activeRM挂了,另外一个standby RM通过
ZKFC选举成功为active,会从/rmstore读取相应的作业信息。
重新构建作业的内存信息,启动内部的服务,
开始接收NM的心跳,构建集群的资源信息,并且接收客户端的作业提交请求。

RM:
1.启动时候会向ZK的/rmstore目录写lock文件,写成功就为active,否则standby.
rm节点zkfc会一直监控这个lock文件是否存在,假如不存在,就为active,否则为standby.
2.接收client的请求,接收和监控NM的资源状况的汇报,负载资源的分配和调度。
3.启动和监控APPMASTER on NM节点的container。
applicationsmanager RM
applicationmaster NM container容器里 作业的主程序

NM:
节点资源的管理 启动容器运行task计算 上报资源


为了更好理解namenode HA。我查阅了有关ZKFC的执行机制。可参考以下两片文章,
https://www.cnblogs.com/lixiaolun/p/6897706.html
https://blog.csdn.net/u012736748/article/details/79541311。
在这里插入图片描述
以下我是的个人理解:
当一个NN 选为active的时候,会在在zookeeper上创建一个znode,是一个临时节点,用来存放选举锁。当连接断了,znode自动删除。

ZKFC核心在于HealthMonitor和ActiveStandbyElector。
HealthMonitor:
ZKFC的HealthMonitor主要是监控NameNode主机上的磁盘还是否可用(空间)。
HealthMonitor会定期的检查namenode是否健康,ZKFC通过RPC调用监控NN进程,当出现异常时,则进入不同的处理逻辑,调用回调函数。总的来说,如果NN健康(SERVICE_HEALTHY)就加入选举,如果不健康就退出选举。
说到退出选举就关系到elector(ActiveStandbyElector)了,true代表如果NN从Actice变为Standby出现异常是要去fence的,这就是为啥NN会挂掉的原因之一。
如何退出选举?就是close zkClient的链接,让ZooKeeper上面的维持的选举锁消失

ActiveStandbyElector: 对于ActiveStandbyElector来说,他有个WatcherWithClientRef类专门用来监听ZooKeeper上的的znode的事件变化,当事件变化时,就会调用ActiveStandbyElector的processWatchEvent的方法。在ActiveStandbyElector的processWatchEvent方法中,处理来自不同事件的逻辑,重新加入选举或者继续监控znode的变化,当另外一个ZKFC监控到事件变化得时候,就去抢锁,抢锁实质上就是创建znode的过程,而且创建的是CreateMode.EPHEMERAL类型的,所以,当HealthMonitor监控到NN不健康时,就会断开连接,节点就会消失,watcher就会监控到NodeDeleted事件,进行创建节点。