乐趣区

关于spark:Spark-Standalone模式

Spark

Spark 的局部内容和之前 Spark 系列重合,然而有些细节之前没有深刻。

Master 启动

基于高可用的思考,Master 会启动多个,然而只能有一个 Master 是提供服务的(ALIVE 状态),其余 Master 都是 STANDBY 状态。

zookeeper 集群的左右,一个是用来选举,另外一个是保留长久化 Application、Driver、Executor 的信息,便于复原。

Worker 启动

Worker 在启动的时候,就会向 Master 进行注册,注册时须要上传 workid,host,端口以及 cup 外围数,内存大小。

因为 Master 是高可用的,所以刚开始 Worker 并不知道 ALIVE 节点是哪个,于是他就会把注册申请发送给每一个 Master 节点。

Worker 只有注册胜利,才会被 Master 调用,所以为了保障注册胜利,Worker 会进行一直的尝试。

一共尝试的次数是 16 次,为了防止所有的 Worker 同一时间发送心跳,给 Master 造成压力,所以发送心跳的间隔时间是随机的。

后面 6 次的心跳间隔时间是 5~15s 之间,前面 10 次的心跳间隔时间是 30~90s 之间。

如果在这 16 次内注册胜利,那就会勾销尝试。如果 16 次都没胜利,那这个 Worker 也没必要启动了,间接退出 Worker 过程。

这里重试的和刚开始注册的时候,有些不同。有可能因为某些起因导致重试,然而这个时候 Worker 是有 Master 的 ALIVE 节点信息,那 Worker 注册的时候,就间接往 ALIVE 节点注册就好了,不必每个 Master 都发送注册申请。

Master 接管注册时,会看看本人是不是 ALIVE 节点,如果是 STANDBY 节点,那间接跟 Worker 说我是 STANDBY 节点,Worker 晓得他是 STANDBY 节点,就不做任何解决。

而后 Master 就会看这个 Worker 是否注册过了(依据 worker 注册提供的 workid),如果注册过了,就跟 Worker 说,注册失败了。

Worker 接管到注册失败的信息,就会看看我有木有注册胜利啊(注册胜利会有变量保留),如果注册胜利,就疏忽这条音讯,晓得本人是反复注册。

如果发现自己没注册胜利,Master 也说没注册胜利,那就是没注册胜利,所以退出 Worker 过程。

如果既不是 STANDBY 节点,Worker 也没注册过,那就保留 Worker 的相应的信息,进行长久化,而后告知 Worker 曾经注册胜利。

Worker 接管到胜利后,就会把变量更改为注册胜利(下面判断有用到),而后记录 Master 的地址(前面申请间接发这个地址了),勾销注册的重试工作(曾经胜利了就不须要再尝试注册了)。

最初会发状态给 Master,因为刚开始注册,Worker 中并没有 Driver 和 Executor,所以 Master 不会解决。

Master 如何晓得 Worker 存活

Worker 注册胜利后,还有一个十分重要的事件,就是发送心跳,维持状态。发送心跳的时候,间接发送 workerid 就好。

Master 接管申请后,先看看是否注册过,如果没有注册过,就会让 Worker 从新注册,就会反复下面的注册流程。如果注册过,就批改 Worker 最初的心跳工夫。

Master 会有一个每隔 60s 的定时工作,对超过 60s 没有发送的 Worker 进行解决,会把这个 Worker 标记为 DEAD 状态,并移除其余相干内存(idToWorker 用于映射 workerid 和 Worker 的关系,addressToWorker 用于映射地址和 Worker 的关系)。

如果 Worker 曾经是 DEAD 状态了,那超过 960s 就把 Worker 信息也移除。

比方 60s 没发心跳,此时 Master 会移除相干内容,而后在 960s 内,Worker 重启后进行注册,那就会把 Worker 中为 DEAD 状态的 Worker 删除,再从新加新的 Worker 信息。

Driver 启动

Driver 在启动后须要向 Master 注册 Application 信息,和 Worker 注册 Master 一样,Driver 也不晓得哪个是 ALIVE 节点,所以他也向所有的 Master 进行注册。

注册信息包含 Application 的名称,Application 须要的最大内核数,每个 Executor 所须要的内存大小,每个 Executor 所需的内核数,执行 Executor 的命令等信息。

这里的注册也有重试次数,最大重试 3 次,每次距离 20s,注册胜利后,就会勾销重试。

Master 收到申请后,如果是 STANDBY 节点,那不做解决,也不回复任何信息(这个和 Worker 注册不一样,Wokrer 那边回回复信息,然而 Worker 不解决)。

如果不是 STANDBY 节点,那就会把 Application 信息保留内存中,并做长久化。

接着就会给 Driver 发送曾经注册胜利的音讯,Driver 接管到音讯,就会记录 Master 的信息,以及外部标识曾经注册胜利,不须要再重试。

Master 如何晓得 Driver 存活

Driver 和 Master 之间并没有心跳,不像 Worker 会定时发送心跳,Master 依据心跳移除过期的 Worker,那 Master 怎么晓得 Driver 是否退出呢?

第一种形式是 Driver 被动告知 Master,第二种形式是 Driver 不失常退出,Master 一旦监听到 Driver 退出了。这两种形式都会勾销 Application 的注册。

Master 接管到勾销注册 Application 的音讯后,就会移除缓存的 Application 及 Application 相干的 Driver 信息。

对于 Driver,有可能还存在运行的 Executor,就会发消息给 Driver,让他杀死 Executor,Driver 收到音讯后就会进行 Application。

对应 Worker,Master 会群发给所有的 Worker,告知这个 Application 已实现,Worker 收到音讯后,会清理 Driver 的临时文件。

最初把 Application 的信息长久化,并且告知其余 Worker 这个 Application 已实现。

Executor 启动

Master 在资源调度的时候,会让 Worker 启动 Executor。

Worker 接管到音讯后,会判断是否是 STANDBY 节点的 Master 发送的音讯,如果不是则疏忽。

如果是,Worker 就会创立一个线程,用来启动一个 Executor 的过程,启动 Executor 的过程后会回复 Master 说 Executor 曾经启动胜利。

Master 晓得 Executor 启动胜利,也会告知 Driver,你的 Executor 我曾经帮你启动了。因为 Executor 并没有完结,Driver 并没有做其余解决。

Executor 启动后,就会向 Driver 进行注册,Driver 先判断是否曾经注册过或者在黑名单里,如果是,返回失败,如果不是,则保留这个 Executor 的信息,并告知 Executor 曾经注册胜利。

Driver 在 Executor 注册时,还做了一件事,就是把注册信息发送给事件总线。Driver 里还有有一个心跳接收器,用于治理 Executor 状态的。

这个心跳接收器会对总线的事件进行监听,当发现有 Executor 新增的时候,就会记录这个 Executor 的 id 和工夫。

Worker 如何晓得 Executor 存活

Worker 创立线程用来启动 Executor 过程的时候,这个线程创立完并不会间接退出,而是始终期待获取 Executor 过程的退出状态。

获取后就会把状态发送给 Worker,Worker 再把状态转发给 Master,并更改本身的内存、CPU 信息。

Master 发现 Executor 执行完了(不论失败还是胜利),就会更新内存信息,并且把状态转发给 Driver。

Driver 收到状态后,发现 Executor 执行完了,会发移除 Executor 的事件给事件总线。

心跳接收器会对总线的事件进行监听,当发现有 Executor 移除的时候,就会移除 Executor。

Executor 如何晓得 Worker 存活

Executor 有一个 WorkerWatcher,当 Worker 过程退出、连贯断开、网络出错时,就会被 WorkerWatcher 监听到,进而终止 Executor 的过程。

Driver 如何晓得 Executor 存活

Executor 收到 Drvier 注册胜利的音讯后,就开始创立 Executor 对象,这个对象实例化后,就会开始对 Driver 的心跳申请,因为可能会多个 Executor 启动,所以为了防止同一时间申请过多,这里的延时工夫会加一个随机值。

心跳接收器接管到心跳申请后,先看看这个 Executor 是否曾经注册了,如果没有,让 Executor 从新注册,如果注册过了,则更新工夫。

心跳接收器有一个定时工作,会扫描每个 Executor 最初上报的工夫,如果 Executor 曾经超过肯定工夫没有发心跳了,就会把这个 Executor 的信息从内存中移除,并且提交“杀死”Executor 的工作。

这个工作最初会发送到 ClientEndpoint,ClientEndpoint 再转发给 Master。

退出移动版