Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spark 源码(4) - Worker 启动流程

Spark 源码(4) - Worker 启动流程

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

一、Worker 启动

今天来看看 Worker 的启动流程,Worker 的启动是从 Shell 脚本开始的,Shell 脚本中就是从 Worker 类的 main 方法开始执行的,所以就从 main 方法开始看。

最主要的是启动了 RpcEnv 和 Endpoint,Worker 本身就是一个 Endpoint,它继承了 ThreadSafeRpcEndpoint 类。

所以下一步自然是去看 Endpoint 的声明周期方法 onStart()

首先创建了工作目录,就是从配置中拿到目录信息,然后创建它

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

然后启动了 Shuffle 服务,这个以后在讲 Shuffle 那块的时候,再来看,先略过:

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

再然后检查了 Worker 的资源是否满足要求:

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

启动了 WebUI

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
webUi = new WorkerWebUI(this, workDir, webUiPort)
webUi.bind()
workerWebUiUrl = s"${webUi.scheme}$publicAddress:${webUi.boundPort}"

最后做了一件重要的事情,向 Master 注册自己:

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

首先启动一个线程,在线程中,首先拿到 Master 的 EndpointRef

然后向 Master 发送一个 RegisterWorker 的消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
masterEndpoint.send(RegisterWorker(
    workerId,
    host,
    port,
    self,   //  Worker 这个 RpcEndpoint 组件的 RpcEndpointRef 对象
    cores,
    memory,
    workerWebUiUrl,
    masterEndpoint.address,
    resources))

二、Master 处理 RegisterWorker 消息

在 Master 类中搜索 case RegisterWorker

首先创建一个 WorkerInfo 对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
val worker = new WorkerInfo(id, workerHost, workerPort, cores, memory,
workerRef, workerWebUiUrl, workerResources)

然后注册这个 Worker :

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

注册完了之后,使用持久化引擎,保存到 zk 中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
persistenceEngine.addWorker(worker)

然后给 Worker 发送一个注册成功的消息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
workerRef.send(RegisteredWorker(self, masterWebUiUrl, masterAddress, false))

最后调用了 schedule() 方法,这个方法非常重要

在这个方法中,遍历了两个数据结构,waitingDrivers,waitingApps

waitingDrivers 是在 Driver 往 Master 注册时,会加入进来;waitingApps 是 Driver 提交任务时,也会加入到这个结构中来。

遍历 waitingDrivers,就会给 Worker 发送 LaunchDriver 消息,来启动 Driver;

遍历 waitingApps,会计算 App 使用的资源,并且在 Worker 上启动对应资源的 Executor

这个过程,在 提交任务的时候,还会详细的讲解。

三、Worker 开始处理 Master 发送回来的注册成功消息

在 Worker 类中搜索:case RegisteredWorker

首先,把 Active Master 的地址等信息,放到自己的内存中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
changeMaster(masterRef, masterWebUiUrl, masterAddress)

然后开始定时给自己发送心跳,然后再处理这个心跳消息,发送给 Master

四、Master 处理 Worker 的心跳消息

Master 收到 Hearbeat 消息后,开始处理 Worker 的心跳消息

首先看,Worker 有没有注册过,如果注册过,则更新心跳时间

如果没有注册过,则给 Worker 发送 ReconnectWorker 消息,要求 Worker 重新注册上来

五、总结

今天我们浏览了 Worker 启动的源码,Worker 启动时,一方面创建了工作目录,启动了 Shuffle 服务,启动了 WebUi;另一方面,向 Master 注册自己,Master 则把 Worker 的信息放到自己的内存中维护起来;同时,Worker 开始周期性发送心跳给 Master。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spark内核详解 (3) | Spark集群启动流程的简单分析
本片博文主要分析的是Standalone 模式下 Spark 集群(Master, work)启动流程
不温卜火
2020/10/28
9710
Spark内核详解 (3) | Spark集群启动流程的简单分析
Spark源码分析————start-all
org.apache.spark.deploy.master.Master 让我们先来看看main()方法
俺也想起舞
2019/07/24
6580
[spark] Standalone模式下Master、WorKer启动流程
而Standalone 作为spark自带cluster manager,需要启动Master和Worker守护进程,本文将从源码角度解析两者的启动流程。Master和Worker之间的通信使用的是基于netty的RPC,Spark的Rpc推荐看深入解析Spark中的RPC。
UFO
2018/08/29
1.7K0
Spark 源码(2) - Spark Rpc 三剑客的理解
谈到 Spark Rpc ,不得不提到 Spark Rpc 的三剑客:RpcEnv,RpcEndpoint,RpcEndpointRef。
kk大数据
2021/10/12
7280
Spark 源码(2) - Spark Rpc 三剑客的理解
Apache Spark 源代码分析之主节点和工作节点间协作流程
Spark 是一个高效的分布式计算框架,但想要更深入地学习它,就需要分析 Spark 的源代码,这不仅可以帮助更好地了解 Spark 的工作过程,还可以提高集群的故障排除能力。本文主要关注Spark Master的启动过程和Worker的启动过程。
jack.yang
2025/04/05
1640
Apache Spark 源代码分析之主节点和工作节点间协作流程
spark RPC原理
Spark-1.6以后RPC默认使用Netty替代Akka,在Netty上加了一层封装,为实现对Spark的定制开发,所以了解Spark中RPC的原理还是有必要的
俺也想起舞
2019/07/24
1.1K0
大数据技术之_19_Spark学习_06_Spark 源码解析小结
1、spark 一开始使用 akka 作为网络通信框架,spark 2.X 版本以后完全抛弃 akka,而使用 netty 作为新的网络通信框架。 最主要原因:spark 对 akka 没有维护,需要 akka 更新,spark 的发展受到了 akka 的牵制,akka 版本之间无法通信,即 akka 兼容性问题。 2、RpcEnv:RPC 上下文环境,每个 Rpc 端点运行时依赖的上下文环境称之为 RpcEnv。类似于 SparkContext,默认由 NettyRpcEnv 实现,由 NettyRpcEnvFactory 创建 RpcEnv。 3、RpcEndpoint:RPC 端点,Spark 针对于每个节点(Client/Master/Worker)都称之一个 Rpc 端点且都实现 RpcEndpoint 接口,内部根据不同端点的需求,设计不同的消息和不同的业务处理,如果需要发送(询问)则调用 Dispatcher。代理是 RpcEndpointRef。 4、Dispatcher:消息分发器,针对于 RPC 端点需要发送消息或者从远程 RPC 接收到的消息,分发至对应的指令收件箱/发件箱。 5、Inbox:指令消息收件箱,一个本地端点对应一个收件箱,Dispatcher 在每次向 Inbox 存入消息时,都将对应 EndpointData 加入内部待 Receiver Queue 中。 6、OutBox:指令消息发件箱,一个远程端点对应一个发件箱,当消息放入 Outbox 后,紧接着将消息通过 TransportClient 发送出去。 7、TransportClient:Netty 通信客户端,主要负责将相对应的 OutBox 中的数据发送给远程 TransportServer。 8、TransportServer:Netty 通信服务端,主要用于接收远程 RpcEndpoint 发送过来的消息,并把消息传送给 Dispatcher。
黑泽君
2019/05/14
6100
大数据技术之_19_Spark学习_06_Spark 源码解析小结
Spark源码分析 之 Driver和Excutor是怎么跑起来的?(2.2.0版本)
今天抽空回顾了一下Spark相关的源码,本来想要了解一下Block的管理机制,但是看着看着就回到了SparkContext的创建与使用。正好之前没有正式的整理过这部分的内容,这次就顺带着回顾一下。 更多内容参考:我的大数据之路 Spark作为目前最流行的大数据计算框架,已经发展了几个年头了。版本也从我刚接触的1.6升级到了2.2.1。由于目前工作使用的是2.2.0,所以这次的分析也就从2.2.0版本入手了。 涉及的内容主要有: Standalone模式中的Master与Worker client、dr
用户1154259
2018/01/17
5790
Spark源码分析 之 Driver和Excutor是怎么跑起来的?(2.2.0版本)
Spark Core源码精读计划#29:BlockManager主从及RPC逻辑
通过前面几篇文章的讲解,我们就把Spark Core存储体系中的内存存储和磁盘存储逻辑基本上讲完了,而负责将这些组件统一管理并发挥作用的就是BlockManager,那么从本文开始,我们就来逐渐探索它的细节……
大数据真好玩
2019/08/21
7450
Spark Core源码精读计划#29:BlockManager主从及RPC逻辑
深入理解Spark 2.1 Core (六):资源调度的原理与源码分析
http://blog.csdn.net/u011239443/article/details/54098376
小爷毛毛_卓寿杰
2019/02/13
9640
深入理解Spark 2.1 Core (六):资源调度的原理与源码分析
Spark Core源码精读计划7 | Spark执行环境的初始化
《Spark Core源码精读计划3 | SparkContext辅助属性及后初始化》
王知无-import_bigdata
2019/08/06
8740
Spark 源码(3) - Master 启动之持久化引擎和选举代理
上回讲到,Master 的 main 方法中,创建了 RpcEnv 和 Master 的 Endpoint,紧接着就开始执行 Endpoint 的生命周期方法 onStart() 方法,今天就从这里开始。
kk大数据
2021/10/12
4320
Spark 源码(3) - Master 启动之持久化引擎和选举代理
Spark 源码(6) - Master 通知 Worker 启动 Driver
上次阅读到客户端发送了一个 RequestSubmitDriver 消息给 Master,Master 收到消息后开始处理。
kk大数据
2021/10/12
4160
Spark 源码(6) - Master 通知 Worker 启动 Driver
Spark RPC 简述
Spark 中的消息通信主要涉及 RpcEnv、RpcEndpoint 及 RpcEndpointRef 几个类,下面进行简单介绍
codingforfun
2018/08/24
5250
Spark RPC 简述
Spark源码 —— 从 SparkSubmit 到 Driver启动
本文主要是以笔记的整理方式写的, 仅以分享的方式供你阅读, 如有不对的地方欢迎指点错误。 读完本文可以学到: 当你用 shell 命令执行 spark-submit 之后, 到你的代码开始正式运行的一些列知识和细节, 恩...粗略的,要看的更细,可以按照流程自己撸源码哈~~~~
solve
2020/01/15
8770
Spark源码 —— 从 SparkSubmit 到 Driver启动
[spark] 从spark-submit开始解析整个任务调度流程
spark应用程序可以以Client模式和Cluster启动,区别在于Client模式下的Driver是在执行spark-submit命令节点上启动的,而Cluster模式下是Master随机选择的一台Worker通过DriverWrapper来启动Driver的。
UFO
2018/08/29
2.2K1
Aloha:一个分布式任务调度框架
Aloha 是一个基于 Scala 实现的分布式的任务调度和管理框架,提供插件式扩展功能,可以用来调度各种类型的任务。Aloha 的典型的应用场景是作为统一的任务管理入口。例如,在数据平台上通常会运行各种类型的应用,如 Spark 任务,Flink 任务,ETL 任务等,统一对这些任务进行管理并及时感知任务状态的变化是很有必要的。
Spark学习技巧
2019/05/15
1.4K0
Spark Core源码精读计划8 | SparkEnv中RPC环境的基础构建
在之前的文章中,我们由SparkContext的初始化提到了事件总线LiveListenerBus与执行环境SparkEnv。在讲解SparkEnv的过程中,RPC环境RpcEnv又是首先被初始化的重要组件。做个不怎么恰当的比较,SparkEnv之于SparkContext,正如RpcEnv之于SparkEnv。
大数据真好玩
2019/08/08
6560
Spark executor 模块② - AppClient 向 Master 注册 Application
前一篇文章简要介绍了 Spark 执行模块中几个主要的类以及 AppClient 是如何被创建的,这篇文章将详细的介绍 AppClient 向 Master 注册 Application 的过程,将主要从以下几个方面进行说明:
codingforfun
2018/08/24
4580
Spark executor 模块② - AppClient 向 Master 注册 Application
Spark Storage ② - BlockManager 的创建与注册
上一篇文章介绍了 Spark Storage 模块的整体架构,本文将着手介绍在 Storeage Master 和 Slave 上发挥重要作用的 BlockManager 是在什么时机以及如何创建以及注册的。接下来分别介绍 Master 端和 Slave 端的 BlockManager。
codingforfun
2018/08/24
4570
Spark Storage ② - BlockManager 的创建与注册
推荐阅读
相关推荐
Spark内核详解 (3) | Spark集群启动流程的简单分析
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验