首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spark 源码(3) - Master 启动之持久化引擎和选举代理

Spark 源码(3) - Master 启动之持久化引擎和选举代理

作者头像
kk大数据
发布于 2021-10-12 04:48:31
发布于 2021-10-12 04:48:31
40600
代码可运行
举报
文章被收录于专栏:kk大数据kk大数据
运行总次数:0
代码可运行

一、Master 启动

上回讲到,Master 的 main 方法中,创建了 RpcEnv 和 Master 的 Endpoint,紧接着就开始执行 Endpoint 的生命周期方法 onStart() 方法,今天就从这里开始。

首先创建了 Master 的 Ui,也就是我们在浏览器上看到的 Master 信息:

紧接着,定时给自己发送 CheckForWorkerTimeOut 消息:

在 Master 类中搜索 case CheckForWorkerTimeOut,可看到如下逻辑:

然后,开始创建持久化引擎和选举代理

什么是 持久化引擎,如果 Master 需要主备,并且使用 Zookeeper 作为主备信息的存储,则需要创建一个读写 Zookeeper 的组件,就称之为持久化引擎。当前这是一种抽象,具体实现可以有多种方式,可以是 Zookeeper,也可以本地文件系统,也可以是自定义的。

二、持久化引擎的创建

new 了这个对象,我们去看它的构造方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new ZooKeeperPersistenceEngine(conf, serializer)

首先从配置中获取存储到 Zookeeper 的主目录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private val workingDir = conf.get(ZOOKEEPER_DIRECTORY).getOrElse("/spark") + "/master_status"

然后创建了一个 Zookeeper 的客户端(这个类就不往下点了,往下就是用 Curator 框架创建了一个 Zookeeper 客户端):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private val zk: CuratorFramework = SparkCuratorUtil.newClient(conf)

然后初始化了工作目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SparkCuratorUtil.mkdir(zk, workingDir)

持久化引擎提供了读写 Zookeeper 的方法

这个方法底层就是 Curator 框架的 Api :

那么这就是持久化引擎的逻辑了,也没什么。

三、选举代理的创建

选举代理,就是提供了一种组件,来实现主备 Master 的选举,它使用了 Curator 框架提供的 LeaderLatch 来实现的

在 ZooKeeperLeaderElectionAgent 的构造器中,调用了 start() 方法

start() 方法中

先拿到了一个 zk 对象,然后创建了一个分布式锁:LeaderLatch,并且注册了一个监听,最后启动。

有个值得注意的点是,如果哪个节点选举成功了,监听就会回调 isLeader() 方法,没有注册成功,则回调 notLeader 方法。

在 isLeader() 方法中,调用了这个方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
updateLeadershipStatus(true)

这个方法中,做了两件事,一个是更改了当前节点的 status 状态为 Leader

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
status = LeadershipStatus.LEADER

第二件事是做了选举之后的一些逻辑,点进去可以看到,给自己发送了一个 ElectedLeader 消息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
self.send(ElectedLeader)

那我们需要在 Master 类中搜索 case ElectedLeader. 看一下是如何处理这个消息的

这里需要考虑一种情况,比如上一个 Alive 状态的 Master 刚挂了,当前 Standby 的 Master 选举成为主节点,那需要从 Zookeeper 中恢复集群的一些数据到自己的内存中。所以,需要先从 Zookeeper 中拿到所有 Application、Driver、Worker 信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
val (storedApps, storedDrivers, storedWorkers) = persistenceEngine.readPersistedData(rpcEnv)

然后开始执行 beginRecovery() 方法,这个方法就是把从 Zookeeper 的各种数据,放到 Master 的各种内存里面:

数据都恢复完成之后,给自己发送一个 CompleteRecovery 消息

CompleteRecovery 消息主要是最后检查一下刚刚恢复出来数据的准确性,此处不细看。

至此,Master 就启动完成了。

四、总结

本次我们主要阅读了 Master 启动时,如何初始化持久化引擎以及选举代理,选举成功之后,都做了些什么事情,对于 Master 启动过程有了初步的了解。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 KK架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spark源码之Standalone模式下master持久化引擎讲解
Spark源码之Standalone模式下master持久化引擎讲解 Standalone 模式下Master为了保证故障恢复,会持久化一些重要的数据,来避免master故障导致集群不可用这种情况(也即单点故障)。目前,有四种持久化策略: 1,基于zookeeper的持久化引擎。 2,基于文件的持久化引擎。 3,用户自定义持久化引擎。 4,不使用持久化引擎。 在master的OnStart方法中,对应的源码如下: val serializer = new JavaSerializer(conf) val (
Spark学习技巧
2018/01/30
6900
基于zookeeper leader选举方式一
一,基本介绍 Curator Framework是一个针对zookeeper做的搞层次的API,极大地简化了zookeeper的使用。它基于zookeeper构建了很多功能,处理复杂的链接管理,重试操作。下面是它的一些特点: 1,自动连接管理。 A),存在的潜在错误情况,需要ZooKeeper客户端创建连接和/或重试操作。Curator 自动和透明(主要)处理这些情况。 B),监视NodeDataChanged事件,并根据需要调用updateServerList()。 C),Watches 会被Curato
Spark学习技巧
2018/01/30
1.2K0
基于zookeeper leader选举方式一
Curator实现基于zookeeper leader选举
Curator Framework是一个针对zookeeper做的搞层次的API,极大地简化了zookeeper的使用。它基于zookeeper构建了很多功能,处理复杂的链接管理,重试操作。下面是它的一些特点:
Spark学习技巧
2020/04/24
9450
深入理解Spark 2.1 Core (八):Standalone模式容错及HA的原理与源码分析
第五、第六、第七篇博文,我们讲解了Standalone模式集群是如何启动的,一个App起来了后,集群是如何分配资源,Worker启动Executor的,Task来是如何执行它,执行得到的结果如何处理,以及app退出后,分配了的资源如何回收。
小爷毛毛_卓寿杰
2019/02/13
8270
深入理解Spark 2.1 Core (八):Standalone模式容错及HA的原理与源码分析
[spark] Standalone模式下Master、WorKer启动流程
而Standalone 作为spark自带cluster manager,需要启动Master和Worker守护进程,本文将从源码角度解析两者的启动流程。Master和Worker之间的通信使用的是基于netty的RPC,Spark的Rpc推荐看深入解析Spark中的RPC。
UFO
2018/08/29
1.7K0
Zookeeper开源客户端Curator之Master/Leader选举
本文介绍了如何使用Curator实现分布式协调,包括Leader选举、分布式锁和分布式队列。首先介绍了Leader选举的原理和常用算法,然后通过实例展示了如何使用Curator实现分布式协调。最后,总结了Curator在分布式协调中的应用场景和注意事项。
程序新视界
2018/01/08
2.2K0
利用Zookeeper实现 - Master选举
Zookeeper 是一个高可用的分布式数据管理与协调框架,基于ZAB协议算法的实现,该框架能够很好的保证分布式环境中数据的一致性。Zookeeper的典型应用场景主要有:数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等。
小旋锋
2019/01/28
1.4K0
Spark 源码(2) - Spark Rpc 三剑客的理解
谈到 Spark Rpc ,不得不提到 Spark Rpc 的三剑客:RpcEnv,RpcEndpoint,RpcEndpointRef。
kk大数据
2021/10/12
7070
Spark 源码(2) - Spark Rpc 三剑客的理解
聊聊storm nimbus的LeaderElector
org/apache/storm/daemon/nimbus/Nimbus.java
code4it
2018/10/18
5700
Flink基于zookeeper的高可用实现源码分析
Flink中JobMaster、ResourceManager、Dispatcher、WebMonitorEndpoint提供了基于zookeeper高可用,涉及到leader选举与监听, leader选举基于zookeeper开源客户端CuratorFramework 的LeaderLatch方式实现,监听则通过NodeCache实现。基于此Flink提供了zookeeper高可用ZooKeeperHaServices, 通过该工具类可以创建LeaderElectionService与LeaderRetrievalService,包含了对应与zookeeper的znode节点分别是
Flink实战剖析
2022/04/18
6220
Spark 源码(4) - Worker 启动流程
今天来看看 Worker 的启动流程,Worker 的启动是从 Shell 脚本开始的,Shell 脚本中就是从 Worker 类的 main 方法开始执行的,所以就从 main 方法开始看。
kk大数据
2021/10/12
5380
Spark 源码(4) - Worker 启动流程
elastic-job-lite 既然去中心化,为何要选举主节点
开篇语 上一篇文章介绍了elastic-job-lite的入门,架构。使用和一些流程,里面提到elastic-job-lite是一个去中心化,轻量级的任务调度框架,那为什么elastic-jib-lite在启动时要选取主节点呢?难道我看错了,哈哈,不可能的,后文 elastic-job-lite简称ejl。 leader选举 ejl定位为轻量级,去中心化,其任务调度由各自的机器驱动,各台机器之间通过zk去协调,ejl为每个任务都创建一个JobScheduler,而在JobScheduler的初始化中回为每个
阿伟
2019/07/22
1.8K0
elastic-job-lite 既然去中心化,为何要选举主节点
跟着实例学习ZooKeeper的用法: Leader选举
Leader Election Barriers Queues Locks Two-phased Commit 其它应用如Name Service, Configuration, Group Membership 在实际使用ZooKeeper开发中,我们最常用的是Apache Curator。 它由Netflix公司贡献给Apache,目前版本2.7.0。 相信你在使用ZK API开发时会遇到让人头疼的几个问题,ZK连接管理、SESSION失效等一些异常问题的处理,Curator替我们解决了这些问题,通过对
用户1263954
2018/01/30
1.2K0
Spark内核详解 (3) | Spark集群启动流程的简单分析
本片博文主要分析的是Standalone 模式下 Spark 集群(Master, work)启动流程
不温卜火
2020/10/28
9230
Spark内核详解 (3) | Spark集群启动流程的简单分析
分布式作业系统 Elastic-Job-Lite 源码分析——主节点选举
1. 概述 本文主要分享 Elastic-Job-Lite 主节点选举。 涉及到主要类的类图如下: . 2. 为什么需要选举主节点 首先我们来看一段官方对 Elastic-Job-Lite 的介绍: Elastic-Job-Lite 定位为轻量级无中心化解决方案,使用 jar 包的形式提供分布式任务的协调服务。 无中心化,意味着 Elastic-Job-Lite 不存在一个中心执行一些操作,例如:分配作业分片项。Elastic-Job-Lite 选举主节点,通过主节点进行作业分片项分配。目前,必须在主节
企鹅号小编
2018/02/02
7650
分布式作业系统 Elastic-Job-Lite 源码分析——主节点选举
分布式作业 Elastic-Job-Lite 源码分析 —— 主节点选举
无中心化,意味着 Elastic-Job-Lite 不存在一个中心执行一些操作,例如:分配作业分片项。Elastic-Job-Lite 选举主节点,通过主节点进行作业分片项分配。目前,必须在主节点执行的操作有:分配作业分片项,调解分布式作业不一致状态。
芋道源码
2018/11/22
5750
elastic-job选主过程
ElasticJob的主服务器的职责是根据当前存活的任务调度服务器生成分片信息,然后拉取属于该分片的任务数据执行任务。为了避免分片信息的不统一,ElasticJob必须从所有的调度服务器中选择一台为主服务器,由该台服务器统一计算分片信息,其他服务根据该分片信息进行任务调度。
leobhao
2022/06/28
4990
elastic-job选主过程
Spark源码分析————start-all
org.apache.spark.deploy.master.Master 让我们先来看看main()方法
俺也想起舞
2019/07/24
6340
spark RPC原理
Spark-1.6以后RPC默认使用Netty替代Akka,在Netty上加了一层封装,为实现对Spark的定制开发,所以了解Spark中RPC的原理还是有必要的
俺也想起舞
2019/07/24
1K0
Zookeeper客户端Curator使用详解
因为最近项目需要使用Zookeeper这个中间件,提前了解一下它的客户端Curator的使用。
Throwable
2020/06/23
1.2K0
推荐阅读
相关推荐
Spark源码之Standalone模式下master持久化引擎讲解
更多 >
交个朋友
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
加入腾讯云技术交流站
洞悉AI新动向 Get大咖技术交流群
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档