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

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

作者头像
kk大数据
发布于 2021-10-12 04:48:31
发布于 2021-10-12 04:48:31
41200
代码可运行
举报
文章被收录于专栏: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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
zk基础—5.Curator的使用与剖析二
PathChildrenCache会调用原生zk客户端对象的getChildren()方法,并往该方法传入一个监听器childrenWatcher。当子节点发生事件,就会通知childrenWatcher这个原生的Watcher,然后该Watcher便会调用注册到PathChildrenCache的Listener。注意:在传入的监听器Watcher中会实现重复注册Watcher。
东阳马生架构
2025/06/28
610
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
6930
Curator实现基于zookeeper leader选举
Curator Framework是一个针对zookeeper做的搞层次的API,极大地简化了zookeeper的使用。它基于zookeeper构建了很多功能,处理复杂的链接管理,重试操作。下面是它的一些特点:
Spark学习技巧
2020/04/24
9530
基于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选举方式一
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
6350
Zookeeper开源客户端Curator之Master/Leader选举
本文介绍了如何使用Curator实现分布式协调,包括Leader选举、分布式锁和分布式队列。首先介绍了Leader选举的原理和常用算法,然后通过实例展示了如何使用Curator实现分布式协调。最后,总结了Curator在分布式协调中的应用场景和注意事项。
程序新视界
2018/01/08
2.2K0
深入理解Spark 2.1 Core (八):Standalone模式容错及HA的原理与源码分析
第五、第六、第七篇博文,我们讲解了Standalone模式集群是如何启动的,一个App起来了后,集群是如何分配资源,Worker启动Executor的,Task来是如何执行它,执行得到的结果如何处理,以及app退出后,分配了的资源如何回收。
小爷毛毛_卓寿杰
2019/02/13
8360
深入理解Spark 2.1 Core (八):Standalone模式容错及HA的原理与源码分析
Spark 源码(2) - Spark Rpc 三剑客的理解
谈到 Spark Rpc ,不得不提到 Spark Rpc 的三剑客:RpcEnv,RpcEndpoint,RpcEndpointRef。
kk大数据
2021/10/12
7130
Spark 源码(2) - Spark Rpc 三剑客的理解
分布式作业 Elastic-Job-Lite 源码分析 —— 主节点选举
无中心化,意味着 Elastic-Job-Lite 不存在一个中心执行一些操作,例如:分配作业分片项。Elastic-Job-Lite 选举主节点,通过主节点进行作业分片项分配。目前,必须在主节点执行的操作有:分配作业分片项,调解分布式作业不一致状态。
芋道源码
2018/11/22
5840
利用Zookeeper实现 - Master选举
Zookeeper 是一个高可用的分布式数据管理与协调框架,基于ZAB协议算法的实现,该框架能够很好的保证分布式环境中数据的一致性。Zookeeper的典型应用场景主要有:数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等。
小旋锋
2019/01/28
1.4K0
zookeeper 浅解
从官网 https://apache.org/dist/zookeeper/zookeeper-3.5.5/ 上下载zk(注意windows也是下载 tar.gz后解压),./conf下有个zoo_sample.cfg 复制到同目录下改名为zoo.cfg,在目录下新建data和log文件夹,修改zoo.cfg中的 dataDir 和 dataLogDir为 data和log的路径。现在启动zk,在bin目录下有个zkServer.cmd,运行启动。启动ZK客户端对ZK进行简单的读写操作,在bin目录下打开cmd,运行:
六个核弹
2021/07/26
2870
聊聊storm nimbus的LeaderElector
org/apache/storm/daemon/nimbus/Nimbus.java
code4it
2018/10/18
5740
Spark 源码(4) - Worker 启动流程
今天来看看 Worker 的启动流程,Worker 的启动是从 Shell 脚本开始的,Shell 脚本中就是从 Worker 类的 main 方法开始执行的,所以就从 main 方法开始看。
kk大数据
2021/10/12
5490
Spark 源码(4) - Worker 启动流程
[spark] Standalone模式下Master、WorKer启动流程
而Standalone 作为spark自带cluster manager,需要启动Master和Worker守护进程,本文将从源码角度解析两者的启动流程。Master和Worker之间的通信使用的是基于netty的RPC,Spark的Rpc推荐看深入解析Spark中的RPC。
UFO
2018/08/29
1.7K0
分布式作业系统 Elastic-Job-Lite 源码分析——主节点选举
1. 概述 本文主要分享 Elastic-Job-Lite 主节点选举。 涉及到主要类的类图如下: . 2. 为什么需要选举主节点 首先我们来看一段官方对 Elastic-Job-Lite 的介绍: Elastic-Job-Lite 定位为轻量级无中心化解决方案,使用 jar 包的形式提供分布式任务的协调服务。 无中心化,意味着 Elastic-Job-Lite 不存在一个中心执行一些操作,例如:分配作业分片项。Elastic-Job-Lite 选举主节点,通过主节点进行作业分片项分配。目前,必须在主节
企鹅号小编
2018/02/02
7720
分布式作业系统 Elastic-Job-Lite 源码分析——主节点选举
Spark 源码(6) - Master 通知 Worker 启动 Driver
上次阅读到客户端发送了一个 RequestSubmitDriver 消息给 Master,Master 收到消息后开始处理。
kk大数据
2021/10/12
4040
Spark 源码(6) - Master 通知 Worker 启动 Driver
源码分析ElasticJob选主实现原理
ElasticJob分布式调度服务器包含两个角色分布为主服务器、从服务器。这里的主从服务器并不是传统意义上的主备。
丁威
2019/06/10
8790
源码分析ElasticJob选主实现原理
少年:ZooKeeper学一下
很多中间件,比如Kafka、Hadoop、HBase,都用到了 Zookeeper,于是很多人就会去了解这个 Zookeeper 到底是什么,为什么它在分布式系统里有着如此无可替代的地位。
sowhat1412
2020/11/05
5930
少年:ZooKeeper学一下
Spark源码分析————start-all
org.apache.spark.deploy.master.Master 让我们先来看看main()方法
俺也想起舞
2019/07/24
6440
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 既然去中心化,为何要选举主节点
相关推荐
zk基础—5.Curator的使用与剖析二
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档