Flink源码学习笔记(1) Flink心跳机制的实现

Flink源码学习笔记(1) Flink心跳机制的实现_第1张图片

前言

开始分享第一篇flink源码的学习,诊断相关的文章仍会继续更新。先讲第一篇Flink实现的心跳机制。Flink代码版本是1.9.2

类图依赖关系

先上个心跳实现的类图

Flink源码学习笔记(1) Flink心跳机制的实现_第2张图片

其中主要的几个接口和实现类

HeartbeatTarget : 请求回复心跳的接口,定义了requestHeartbeat (请求心跳),receiveHeartbeart(回复心跳)。

Flink源码学习笔记(1) Flink心跳机制的实现_第3张图片

HeartbeatManager : 维护请求回复心跳的接口,继承自 HeartbeatTarget,定义了 monitorTarget,unmonitorTarget等方法。即注册,注销相关的HeartbeatTarget。

Flink源码学习笔记(1) Flink心跳机制的实现_第4张图片

举个例子,比如JobManager与TaskManager之间有需要心跳。那么JobMaster和Taskmanager维护的HeartbeatManager都会注册彼此的HeartbeatTarget实现。如图JobMaster 这里实现了主动发起的requestHeartbeat,通过rpc方法向TaskManager发起心跳。

Flink源码学习笔记(1) Flink心跳机制的实现_第5张图片

Taskmanager的HeartbeatManager也会注册JobMaster的HeartbeatTarget。这里只需要实现回复心跳相关的逻辑即可,如图同样是通过rpc的方式向JobManager回复心跳。

Flink源码学习笔记(1) Flink心跳机制的实现_第6张图片

HeartbeatManagerImpl :是HeartbeatManager的实现类,可以看到这个类组合了HeartMonitor实现的工厂类。

1.如图看到其实现的monitorTarget方法: 每监听到一个HeartbeatTarget都会为其生成一个HeartMonitor(主要负责超时,重置超时时间等操作,同样是用的主线程)

Flink源码学习笔记(1) Flink心跳机制的实现_第7张图片

2.requestHeartbeat 方法

Flink源码学习笔记(1) Flink心跳机制的实现_第8张图片

3.receiveHeartbeat 方法,重置心跳超时时间,处理payload的逻辑。这次心跳就结束了。

Flink源码学习笔记(1) Flink心跳机制的实现_第9张图片

HeartbeatMonitor : 维护HeartbeatTarget的状态,监控其是否超时,且每次心跳都会重置超时

Flink源码学习笔记(1) Flink心跳机制的实现_第10张图片

HeartbeatManagerSenderImpl : **HeartbeatManagerImpl **的子类,会定期向已注册的HeartbeatTarget请求心跳。

Flink源码学习笔记(1) Flink心跳机制的实现_第11张图片

HeartbeatMonitorImp :HeartbeatMonitor的实现类

HeartbeatListener :

1.心跳的请求和回复都会携带Payload

2.心跳超时的回调

Flink源码学习笔记(1) Flink心跳机制的实现_第12张图片

JobMaster与Taskmanager之间的心跳流程

举例说一个JobMaster与TaskManager之间的心跳流程

1.首先当JobMaster服务启动时会新建与TaskManager相关的HeartbeatManagerSender

![image-20211028222134977](https://wgcn.oss-cn-beijing.aliyuncs.com/img/image-20211028222134977.png

Flink源码学习笔记(1) Flink心跳机制的实现_第13张图片

TaskManagerHeartbeatListener的实现 #retrivePayload: 在向TaskManager发心跳请求时会携带 被占用的slot信息,#reportPayload 当接收到TaskManager的心跳回复会收到每个ExecutionAttempt的Accumulator快照 (用过Accmulator api的同学应该比较熟悉这个)

Flink源码学习笔记(1) Flink心跳机制的实现_第14张图片

在有新的Taskmanager注册到JobMaster时,会向HeartbeatManagerSender 注册TaskManager的HeartbeatTaget

Flink源码学习笔记(1) Flink心跳机制的实现_第15张图片

2.定时发送

步骤一创建的taskManagerHeartbeatManagerSend对象会定时向被注册的TaskManager的HeartbeatTarget发起心跳请求.如下图

Flink源码学习笔记(1) Flink心跳机制的实现_第16张图片

步骤1中 HeartbeatTarget的实现会通过rpc方法taskExecutorGateway#heartbeatFromJobManager访问Taskmanager。

Flink源码学习笔记(1) Flink心跳机制的实现_第17张图片

3.Taskmanager 的实现

在Taskmanager同样会维护一个HeartbeatManager用来与JobMaster通信

image-20211029121000675

其中从Listerner的reportPayload和retrievePayload实现可以看到Taskmanager接收了JobMaster占用的slot信息。同时TaskManager会把每个task的Accmulator快照发给JobManager。

Flink源码学习笔记(1) Flink心跳机制的实现_第18张图片

TaskManager接收到了心跳请求通过HeartbeatManager处理

Flink源码学习笔记(1) Flink心跳机制的实现_第19张图片

如图HeartbeatManager收到心跳请求的实现(复习下之前类图降到的requestHeartbeat实现)

Flink源码学习笔记(1) Flink心跳机制的实现_第20张图片

其中第三步 heartbearTarget的实现,向JobMasterGateway发送心跳。

Flink源码学习笔记(1) Flink心跳机制的实现_第21张图片

4.心跳发回JobMaster

image-20211029204626777

复习下类图模块 HeartbeatManagerImpl讲的receiveHeartbeat方法

Flink源码学习笔记(1) Flink心跳机制的实现_第22张图片

更新完Accumulator的快照之后,这个心跳周期就结束了

Flink源码学习笔记(1) Flink心跳机制的实现_第23张图片

结论

  1. 心跳会发生在主线程
  2. 心跳会携带payload
  3. 发送心跳和恢复心跳都会刷新心跳的超时时间

你可能感兴趣的:(Flink,flink)