大数据IMF传奇行动绝密课程第29课:Master HA彻底解密

大数据IMF传奇行动绝密课程第29集:Master HA彻底解密
1、Master HA解析
2、Master HA的四种方式
3、Master HA的内部工作机制
4、Master HA的源码解密
图29-1 Spark高可用HA实战
ZooKeeper工作的时候有一台Leader的机器(active),其他的机器是Follower
一般一共3个足够了

由于Zookeeper保留了集群信息(Worker、Drivers、应用程序等)会被持久化到Zookeeper中,只会影响到job提交

1、Master HA解析
a)生产环境下一般采用ZooKeeper做HA,且建议为3台Master,ZooKeeper会自动化管理Masters的切换;
b)采用ZooKeeper做HA的时候,ZooKeeper会负责保存整个Spark集群运行时侯的元数据:Workers、Drivers、Applications、Executors;
c)ZooKeeper遇到当前Active级别的Master出现故障的时候会从Standby Masters中选取出一台作为Active Master,但是要注意,被选举后到成为真正的Active Master之间需要从ZooKeeper中获取集群当前运行状态的元数据信息,并进行恢复
d)在Master切换的过程中,所有的已经在运行的程序皆正常运行,因为Spark Application在运行前就已经通过Cluster Manager获得了计算资源,所以在运行时Job本身的调度和处理和Master是没有任何关系的!
e)在Master的切换过程中唯一的影响是不能提交新的Job:一方面不能够提交新的应用程序给集群,因为只有Active Master才能接收新的程序的提交请求;另外一方面,已经运行的程序中也不能够因为Action操作触发新的Job的提交请求;
2、Master HA的四大方式
a)Master HA的四大方式分别是:ZOOKEEPER、FILESYSTEM、CUSTOM、NONE
b)需要说明的是:ZOOKEEPER是自动管理Master;FILESYSTEM的方式在Master出现故障后需要手动重新启动机器,机器启动后会立即成为Active级别的Master来对外提供服务(接受应用程序提交的请求、接受新的Job运行的请求);CUSTOM的方式允许用户自定义MASTER HA的实现,这对于高级用户特别有用;NONE是默认情况,当我们下载安装了Spark集群中就是采用方式,该方式不会持久化集群的数据,Master启动后立即管理集群;

c)

    val serializer = new JavaSerializer(conf)
    val (persistenceEngine_, leaderElectionAgent_) = RECOVERY_MODE match {
      case "ZOOKEEPER" =>
        logInfo("Persisting recovery state to ZooKeeper")
        val zkFactory =
          new ZooKeeperRecoveryModeFactory(conf, serializer)
        (zkFactory.createPersistenceEngine(), zkFactory.createLeaderElectionAgent(this))
      case "FILESYSTEM" =>
        val fsFactory =
          new FileSystemRecoveryModeFactory(conf, serializer)
        (fsFactory.createPersistenceEngine(), fsFactory.createLeaderElectionAgent(this))
      case "CUSTOM" =>
        val clazz = Utils.classForName(conf.get("spark.deploy.recoveryMode.factory"))
        val factory = clazz.getConstructor(classOf[SparkConf], classOf[Serializer])
          .newInstance(conf, serializer)
          .asInstanceOf[StandaloneRecoveryModeFactory]
        (factory.createPersistenceEngine(), factory.createLeaderElectionAgent(this))
      case _ =>
        (new BlackHolePersistenceEngine(), new MonarchyLeaderAgent(this))

d)PersistenceEngine中有一个至关重要的方法persist来实现数据持久化,readPersistData来恢复集群中的元数据

RecoveryModeFactory来自定义

  /**
   * Defines how the object is serialized and persisted. Implementation will
   * depend on the store used.
   */
  def persist(name: String, obj: Object)



    final def readPersistedData(
      rpcEnv: RpcEnv): (Seq[ApplicationInfo], Seq[DriverInfo], Seq[WorkerInfo]) = {
    rpcEnv.deserialize { () =>
      (read[ApplicationInfo]("app_"), read[DriverInfo]("driver_"), read[WorkerInfo]("worker_"))
    }
  }

e)FILESYSTEM和NONE的方式均是采用MonarchyElectionAgent的方式来完成Leader选举,其实际实现是直接将传入的Master设置为Leader

3、Master HA的内部工作机制

Master完成恢复时的代码

  private def completeRecovery() {
    // Ensure "only-once" recovery semantics using a short synchronization period.
    if (state != RecoveryState.RECOVERING) { return }
    state = RecoveryState.COMPLETING_RECOVERY

    // Kill off any workers and apps that didn't respond to us.
    workers.filter(_.state == WorkerState.UNKNOWN).foreach(removeWorker)
    apps.filter(_.state == ApplicationState.UNKNOWN).foreach(finishApplication)

    // Reschedule drivers which were not claimed by any workers
    drivers.filter(_.worker.isEmpty).foreach { d =>
      logWarning(s"Driver ${d.id} was not found after master recovery")
      if (d.desc.supervise) {
        logWarning(s"Re-launching ${d.id}")
        relaunchDriver(d)
      } else {
        removeDriver(d.id, DriverState.ERROR, None)
        logWarning(s"Did not re-launch ${d.id} because it was not supervised")
      }
    }

如果以集群方式运行,同时指定了supervise,此种方式在Drivers失败后可以重启Driver

if (d.desc.supervise) {
    logWarning(s"Re-launching ${d.id}")
    relaunchDriver(d)
}

图29-2 ZOOKEEPER下MASTER HA的基本流程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值