5.1 Spark运行模式
Spark支持Standalone,Mesos,YARN,EC2,Local部署模式
5.1.1 Local模式
1)local
使用单线程处理计算任务,不会重新计算失败的计算任务
2)local[N]/local[*]
前者使用N线程处理计算任务,后者工作线程数取决于CPU Cores,保证一个工作线程可以占有一个CPUCore,同样不会重新计算失败的任务
3)local[threads,maxFailures]threads设置工作线程数,maxFailures设置失败的最大重试次数
4)local-cluster[numSlaves,coresPerSlave,memoryPerSlave]伪分布式模式,本机会运行Master和Worker,其中numSlaves为Worker数量,coresPerSlaves每个Worker能使用的CPU Core数memoryPerSlave设置每个Worker能使用的内存数
Worker接收到Master发送的LaunchExecutor消息后,会创建ExecutorRunner,进而启动CoraseGrainedExecutorBackend,进而启动Executor(运行多个TaskRunner)
5.1.2 YARN模式
Client提交Job后,ApplicationMaster会向ResourceManager请求资源,获取资源后ApplicationMaster会在NodeManager上启动Container,运行计算任务,并能和Container保持联系,监控任务的运行状态
1)YARN Cluster模式
Ø YARN Client提交Application至ResourceManager
Ø ResourceManager在任意工作节点启动ApplicationMaster,期间会创建YarnClusterScheduler以及YarnClusterSchedulerBackend
Ø ApplicationMaster在NodeManager上启动若干Container用于启动CoraseGrainedExecutorBackend
Ø CoraseGrainedExecutorBackend启动Executor
2)YARN Client模式
与Cluster模式区别在于Client模式的Client与Driver在同一台机器上
Ø SparkContext初始化创建YarnClientClusterScheduler和YarnClientSchedulerBackend(可与CoraseGrainedSchedulerBackend通信)
Ø YarnClientSchedulerBackend启动Client,用于提交Application至ResourceManager
5.2 模块整体架构
1)Master用于资源调度以及Application管理,Worker的注册以及管理所有的Worker,接收Client提交的Application,FIFO调度等待的Application并向Worker提交
2)Worker用于接收资源分配调度命令并启动Executor,向Master注册自己,根据Master发送的Application配置进程环境并启动StandaloneExecutorBackend
3)Client用于创建Application,并向Master注册Application并监控Application
4)Executor执行具体的计算任务
5.3 消息传递机制
Master与Worker之间采用AKKA通信
1)Worker向Master发送的消息
注册(RegisterWorker):Worker启动时需要向Master注册,并汇报自身信息
状态汇报(ExecutorStateChanged和DriverStateChanged):汇报Executor和Driver的运行状态;Master故障时需要汇报Worker上当前运行的Executor和Driver信息(WorkSchedulerStateResponse)
报活心跳(Heartbeat):Worker周期性的想Master发送报活心跳
2)Master向Worker发送的信息
Worker注册成功(RegisteredWorker),Worker注册失败(RegisterWorkerFailed),告诉Worker需要重新注册(ReconnectWorker),Worker删除指定Executor(KillExecutor),Worker启动Executor(LaunchExecutor),Worker启动Driver(LaunchDriver),Worker删除Driver(KillDriver)
Master与Client(Driver Client和AppClient)
1)DriverClient与Master
向Master提交Driver(RequestSubmitDriver),向Master杀死Driver(RequestKillDriver),获取Driver的当前运行状态(RequestDriverStatus)
2)Master与Driver Client
Master向Driver返回注册响应(SubmitDriverResponse)
Master向Driver返回杀死Driver响应(KillDriverResponse)
Master向Driver返回状态信息(DriverStatusResponse)
AppClient持有ClientActor
1)AppClient与Master
AppClient向Master注册Application(RegisterApplication)
Master故障恢复后通知AppClient和Worker(MasterChangeAcknowledged)
2)Master与AppClient
回复Application的注册结果(RegisteredApplication)
Worker启动Executor通知AppClient(ExecutorAdded)
Executor的状态更新通知AppClient(ExecutorUpdated)
通知AppClient停止Application(ApplicationRemoved)
Master故障恢复后需要通知AppClient和Worker(MasterChanged)
Driver与Executor
1)Driver向Executor
启动Task(LaunchTask)
杀死Task(KillTask)
注册成功反馈(RegisteredExecutor)
注册失败反馈(RegisteredExecutorFailed)
2)Executor向Drvier
注册Executor(RegisterExecutor)
汇报Executor运行的Task状态(StatusUpdate)
5.4 集群的启动
5.4.1 Master启动
1)ZooKeeper
元数据信息会持久化到ZooKeeper中,当Master故障后,ZooKeeper会备份Master中选举新的Master作为Leader,新的Master会从ZooKeeper中获取元数据信息并恢复数据
2)FILESYSTEM
集群的元数据信息保存在本地文件系统中,Master启动后立即成为Active的Master
3)CUSTOM
用户自定义,需要实现StandaloneRecoveryModeFactory,需要实现
createPersistenceEngine()持久化和恢复数据
createLeaderElectionAgent()从Standby的Master中选举一个Master作为集群的Leader
4)NONE
不会持久化集群的元数据,Master启动后立即接管集群的管理工作
被选举为Leader的Master会读取元数据信息,Master状态变为RecoveryState.RECOVERING然后开始恢复数据并通知Worker,AppClient,Driver Client,Master已经改变,恢复结束后的Master状态变为RecoveryState.ALIVE(只有为ALIVE状态时才能向外提供服务)
Master故障恢复时需要对Application,Worker,Driver Client的元数据恢复(beginRecovery),基本操作都是先将其状态置为UNKNOWN,Master再通知其MasterChanged,Master接收到其响应后,会将其状态从UNKNOWN设置为正常状态,当所有的UNKNOWN均变为正常状态后,则会调用completeRecovery()完成恢复,其工作原理:
1)RecoveryState.COMPLETING_RECOVERY更新Recovery状态
2)清除所有未响应的Worker和Application
3)对于未分配Worker的Driver Client确定是否需要重新启动
4)Master状态置为ALIVE,Master可对外提供服务
5.4.2 Worker启动
Worker启动只会向Master发送注册请求(RegisterWorker),Master会向Worker反馈注册成功或者失败(RegisterWorker or RegisterWorkerFailed),Worker在一段时间内未收到Master的反馈则会重新注册(默认至多重试16次)
Worker.registerWithMaster(第一次调用时会向所有的Master进行注册即tryRegisterAllMasters()),注册成功后,Worker可对外提供服务
5.5 集群容错处理
5.5.1 Master异常退出
推荐使用ZooKeeper实现Master的容错
5.5.2 Worker异常退出
1)Worker退出前会清除在它上面运行的所有Driver Client和Executor
2)Worker需要周期性的向Master发送心跳信息,将Executor标记为丢失,对于Driver Client设置为需要重启,否则直接清除
3)AppClient接到Master的StatusUpdate消息后更新汇报给SparkDeploySchedulerBackend并判断是否是Executou异常退出,然后重新调度,Task分配新的Executor
5.5.3 Executor异常退出
Executor启动的调用栈:
1)Worker接收到Master的LaunchExecutor命令后,创建ExecutorRunner
2)ExecutorRunner.fetchAndRunExecutor负责向Driver注册Executor
3)CoarseGrainedSchedulerBackend(负责与Driver通信并汇报Executor状态)接收到Driver的RegisteredExecutor后创建Executor
Executor异常退出,Master会为Application分配新的Executor,若超过10次,则Application标记失败