一、涉及到的源码列表:
- Master.scala
- WorkerInfo.scala
- DriverDescription.scala
- RecoveryState.scala
- PersistenceEngine.scala
- MetricsSystem.scala
- ApplicationDescription.scala
- DeployMessage.scala
等等
##二、语言叙述(包括截图):
A:主备切换
1.概述: 关键词——(standalong模式,Active Master,两种主备切换模式,具体操作)
spark的standalone模式提供了master的HA,与hadoop一样,一个是active,一个是standby状态。spark HA的主备切换主要基于两种机制:基于文件系统和基于zk集群。前者在挂了后需要手动切换,而基于zk的HA可以自动实现切换。
图 1
2.主备切换的简要流程:关键词——(等待的Master,持久化引擎,如果不为空,重新注册到内存,修改状态,发送master地址,检测过滤,schedule()调度)
图 2
B:注册机制
- 注册机制:关键词——(注册woker、application,持久化,schedule,在队列中等待调度)
C:状态改变机制
D:资源调度机制(schedule(),目前两种资源调度方法)
##三、相应源码查看学习:
- Master.scala
定义一些变量:
// RecoveryState有STANDBY, ALIVE, RECOVERING, COMPLETING_RECOVERY四个阶段
private var state = RecoveryState.STANDBY
// 持久化引擎
private var persistenceEngine: PersistenceEngine = _
private var leaderElectionAgent: LeaderElectionAgent = _
private var recoveryCompletionTask: ScheduledFuture[_] = _
private var checkForWorkerTimeOutTask: ScheduledFuture[_] = _
// 在有更好的配置内存的方法之前,作为暂时的 workaround ,我们允许用户设置一个标志,
// 这个标志 will perform round-robin scheduling across the nodes (spreading out each app
// among all the nodes) instead of trying to consolidate each app onto a small # of nodes.
private val spreadOutApps = conf.getBoolean("spark.deploy.spreadOut", true)
// 如果不特别指定,就对applications默认使用MaxValue值 (i.e. pass Int.MaxValue)
private val defaultCores = conf.getInt("spark.deploy.defaultCores", Int.MaxValue)
onStart函数(Inbox.scala中有调用它)
override def onStart(): Unit = {
// 在使用Spark-shell时,常看见的一些