1、Master HA概述
Spark在生产上做HA一般采用的是通过zookeeper的方式,配置3个master的话是比较可靠的方式。采用zookeeper做HA的话zookeeper会保存整个Spark程序运行时候的元数据(包括Workers,Drivers,Applications,Executors等信息)。
采用zookeeper的数据保存方式,启动的时候会读取zookeeper中曾经保存的数据,这样再次启动的集群就是在上一次关闭集群的已有状态基础上继续已有的状态。
zookeeper本身提供的leader选举机制,具体工作的时候会有一个leader的一台机器,负责对外提供服务。提交程序的时候其实就是交给作为leader的master(activer级别的),其他作为follower,利用这个机制就要可以保证集群中多个master,只有一个是activer。当activer级别的出现故障的,作为standby的master就会被zookeeper通过自己的机制选举出来,由于zookeeper中保留了集群的信息(worker的信息,driver的信息,所有应用程序的信息),这些信息会被持久化到zookeeper中,所以在切换的过程中只会有一个影响就是只会影响新的job的提交。在粗粒度模式下,通过cluster Manage获取计算资源之后就和cluster Manage没有关系了,接下来的是driver和executor的交互,所以master挂掉并不影响实际的运行。
2、Master HA的四种方式
Master HA的四种方式:zookeeper,fileSystem(对实时性要求不高可用),custom(自定义),none。
master启动的时候会根据具体的RECOVERY_MODE选择具体不同的HA和元数据持久化恢复的方式
在master的onStart方法中有如下代码
这里的RECOVERY_MODE就是从配置中获取的信息,然后进行模式匹配,这里有4中不同的case。ZOOKEEPER的方式是new ZookeeperRecoveryModeFactory,是StandaloneRecoveryModeFactory的子类如果客户需要自动以就继承这个类并重写createPersistenceEngine(这个是数据持久化的引擎)和createLeaderElectionAgent方法(这个是leader选举的代理)。
数据持久化引擎关系到怎么具体持久化drivers,applications,workers,executors的信息;而leader选举的代理涉及到我们,在当activer级别的master出故障的时候怎么从standby模式中选取出一个leader,进一步进行数据恢复。
在PersistenceEngine中有一个至关重要的方法persist来实现数据持久化。
fileSystem和None的方式MonarchyLeaderAgent选举,实现方法就是将直接传入的master设置为leader
3、Master HA基于Zookeeper的工作机制
zookeeper做HA的机制。首先从zookeeper的方式讲,zookeeper会自动的实现master切换,所以在这个切换过程中是:
(1)Zookeeper自动选举出作为leader的Master后;
(2)使用zookeeper持久化引擎ZookeeperPersistenceEngine去读取我们集群的状态数据:drivers,applications,workers,还有具体的executors等信息;
(3)下一步就是判断元数据信息是否有空的内容;
(4)然后将持久化获得的drivers,applications,workers,executors等信息重新进行注册,放到作为leader的master的内存中缓存起来;
(5)有这些信息了,肯定要确认一下这些信息是否和现在集群中你的信息是否是一致的,所以这时候会把applications,drivers等的信息变成unkown方式,然后向application所对应的driver以及worker发送从Standby的master变成leader的地址信息;
(6)地址信息发过去后,driver,worker正常运行的话就会接收到地址信息,返回响应给master;
(7)转过来master接收到来自drivers和workers的响应信息后会使用一个关键的方法:completeRecovery来对没有响应的applications(driver)和workers(executor)进行处理,处理之后master的State会合并,RecoveryState.ALIVE从而开始可以对外提供服务;
(8)此时Master调用自己的Scheduler方法对正在进行等待的Applications和Drivers进行资源调度。