Master HA彻底解密

本期内容:

   1、MasterHA解析

   2、Master HA的四种方式

   3、Master HA的内部工作机制

   4、Master HA的源码解析

实际提交程序的时候,提交给作为Leader的Master;

程序在运行前是粗粒度的资源分配模式,一般一个Master挂掉后,并不影响集群的运行。


一、Master HA解析

   1、生产环境下一般采用Zookeeper做HA,且建议为三台Master,Zookeeper会自动化管理Masters的切换;

   2、采用Zookeeper做HA的时候,Zookeeper会负责保存整个Spark集群运行的时候的元数据:Workers、Drivers、Executor;

   3、Zookeeper遇到当前Active级别的Master出现故障的时候会从StandbyMaster中选取出一台作为Active级别的Master,但是需要注意被选举后到成为真正的ActiveMaster之间需要从Zookeeper中获取集群当前运行状态的元数据信息并进行恢复;

   4、在Master切换的过程中,所有的已经在运行的程序皆运行正常!因为SparkApplication在运行前已经通过Cluster Manager获取了计算资源,所以在运行时Job本身的调度和处理和Master是没有任何关系的!

   5、在Master切换过程中唯一的影响是不能提交新的Job:一方面是不能够提交新的应用程序给集群,因为只有Active Master才能接受新的程序的提交请求;另外一方面,已经运行的程序中也不能够因为因为Active操作触发新的Job的提交请求;

二、Master HA的四大方式

   1、Master HA的四种方式分别是:Zookeeper、FILESYSTEM(对实时性、延迟性要求没有那么高)、CUSTOM、NONE;

   2、需要说明的是:

       a)Zookeeper是自动管理Master;

       b)FILESYSTEM的方式在Master出现故障后需要手动重新启动机器,机器启动后会立即成为Active级别的Master来对外提供服务(接收应用程序提交的请求、接收新的Job运行的请求);

       c)CUSTOM等的方式运行用户自定义MasterHA的实现,这对于高级用户特别有用;

       d)None,这是默认情况,当我们下载安装了Spark集群中就是采用

  1. val (persistenceEngine_, leaderElectionAgent_) = RECOVERY_MODE match {  
  2.   case "ZOOKEEPER" =>  
  3.     logInfo("Persisting recovery state to ZooKeeper")  
  4.     val zkFactory =  
  5.       new ZooKeeperRecoveryModeFactory(conf, serializer)  
  6.     (zkFactory.createPersistenceEngine(), zkFactory.createLeaderElectionAgent(this))  
  7.   case "FILESYSTEM" =>  
  8.     val fsFactory =  
  9.       new FileSystemRecoveryModeFactory(conf, serializer)  
  10.     (fsFactory.createPersistenceEngine(), fsFactory.createLeaderElectionAgent(this))  
  11.   case "CUSTOM" =>  
  12.     val clazz = Utils.classForName(conf.get("spark.deploy.recoveryMode.factory"))  
  13.     val factory = clazz.getConstructor(classOf[SparkConf], classOf[Serializer])  
  14.       .newInstance(conf, serializer)  
  15.       .asInstanceOf[StandaloneRecoveryModeFactory]  
  16.     (factory.createPersistenceEngine(), factory.createLeaderElectionAgent(this))  
  17.   case _ =>  
  18.     (new BlackHolePersistenceEngine(), new MonarchyLeaderAgent(this))  
  19. }  
  20. persistenceEngine = persistenceEngine_  
  21. leaderElectionAgent = leaderElectionAgent_  

4、PersistenceEngine中有一个至关重要的方法persist来实现数据持久化,readPersistData来恢复获取;

  1. /** 
  2.  * Returns the persisted data sorted by their respective ids (which implies that they're 
  3.  * sorted by time of creation). 
  4.  */  
  5. final def readPersistedData(  
  6.     rpcEnv: RpcEnv): (Seq[ApplicationInfo], Seq[DriverInfo], Seq[WorkerInfo]) = {  
  7.   rpcEnv.deserialize { () =>  
  8.     (read[ApplicationInfo]("app_"), read[DriverInfo]("driver_"), read[WorkerInfo]("worker_"))  
  9.   }  
  10. }  
  11. /** 
  12.  * Defines how the object is serialized and persisted. Implementation will 
  13.  * depend on the store used. 
  14.  */  
  15. def persist(name: String, obj: Object)  
  16.   
  17. /** 
  18.  * Defines how the object referred by its name is removed from the store. 
  19.  */  
  20. def unpersist(name: String)  
 5 FILESYSTEM NONE 的方式均采用 MonarchyElectionAgent 的方式来完成 Leader 选举
  1. private def completeRecovery() {  
  2.     // Ensure "only-once" recovery semantics using a short synchronization period.  
  3.     if (state != RecoveryState.RECOVERING) { return }  
  4.     state = RecoveryState.COMPLETING_RECOVERY  
  5.    
  6.     // Kill off any workers and apps that didn't respond to us.  
  7.     workers.filter(_.state == WorkerState.UNKNOWN).foreach(removeWorker)  
  8.     apps.filter(_.state == ApplicationState.UNKNOWN).foreach(finishApplication)  
  9.    
  10.     // Reschedule drivers which were not claimed by any workers  
  11.     drivers.filter(_.worker.isEmpty).foreach { d =>  
  12.       logWarning(s"Driver ${d.id} was not found after master recovery")  
  13.       if (d.desc.supervise) {  
  14.         logWarning(s"Re-launching ${d.id}")  
  15.         relaunchDriver(d)  
  16.       } else {  
  17.         removeDriver(d.id, DriverState.ERROR, None)  
  18.         logWarning(s"Did not re-launch ${d.id} because it was not supervised")  
  19.       }  
  20.     }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值