前言
开始分享第一篇flink源码的学习,诊断相关的文章仍会继续更新。先讲第一篇Flink实现的心跳机制。Flink代码版本是1.9.2
类图依赖关系
先上个心跳实现的类图
其中主要的几个接口和实现类
HeartbeatTarget : 请求回复心跳的接口,定义了requestHeartbeat (请求心跳),receiveHeartbeart(回复心跳)。
HeartbeatManager : 维护请求回复心跳的接口,继承自 HeartbeatTarget,定义了 monitorTarget,unmonitorTarget等方法。即注册,注销相关的HeartbeatTarget。
举个例子,比如JobManager与TaskManager之间有需要心跳。那么JobMaster和Taskmanager维护的HeartbeatManager都会注册彼此的HeartbeatTarget实现。如图JobMaster 这里实现了主动发起的requestHeartbeat,通过rpc方法向TaskManager发起心跳。
Taskmanager的HeartbeatManager也会注册JobMaster的HeartbeatTarget。这里只需要实现回复心跳相关的逻辑即可,如图同样是通过rpc的方式向JobManager回复心跳。
HeartbeatManagerImpl :是HeartbeatManager的实现类,可以看到这个类组合了HeartMonitor实现的工厂类。
1.如图看到其实现的monitorTarget方法: 每监听到一个HeartbeatTarget都会为其生成一个HeartMonitor(主要负责超时,重置超时时间等操作,同样是用的主线程)
2.requestHeartbeat 方法
3.receiveHeartbeat 方法,重置心跳超时时间,处理payload的逻辑。这次心跳就结束了。
HeartbeatMonitor : 维护HeartbeatTarget的状态,监控其是否超时,且每次心跳都会重置超时
HeartbeatManagerSenderImpl : **HeartbeatManagerImpl **的子类,会定期向已注册的HeartbeatTarget请求心跳。
HeartbeatMonitorImp :HeartbeatMonitor的实现类
HeartbeatListener :
1.心跳的请求和回复都会携带Payload
2.心跳超时的回调
JobMaster与Taskmanager之间的心跳流程
举例说一个JobMaster与TaskManager之间的心跳流程
1.首先当JobMaster服务启动时会新建与TaskManager相关的HeartbeatManagerSender
![image-20211028222134977](https://gitee.com/wgcn_bj/pic_bed/raw/master/img/image-20211028222134977.png
TaskManagerHeartbeatListener的实现 #retrivePayload: 在向TaskManager发心跳请求时会携带 被占用的slot信息,#reportPayload 当接收到TaskManager的心跳回复会收到每个ExecutionAttempt的Accumulator快照 (用过Accmulator api的同学应该比较熟悉这个)
在有新的Taskmanager注册到JobMaster时,会向HeartbeatManagerSender 注册TaskManager的HeartbeatTaget
2.定时发送
步骤一创建的taskManagerHeartbeatManagerSend对象会定时向被注册的TaskManager的HeartbeatTarget发起心跳请求.如下图
步骤1中 HeartbeatTarget的实现会通过rpc方法taskExecutorGateway#heartbeatFromJobManager访问Taskmanager。
3.Taskmanager 的实现
在Taskmanager同样会维护一个HeartbeatManager用来与JobMaster通信
其中从Listerner的reportPayload和retrievePayload实现可以看到Taskmanager接收了JobMaster占用的slot信息。同时TaskManager会把每个task的Accmulator快照发给JobManager。
TaskManager接收到了心跳请求通过HeartbeatManager处理
如图HeartbeatManager收到心跳请求的实现(复习下之前类图降到的requestHeartbeat实现)
其中第三步 heartbearTarget的实现,向JobMasterGateway发送心跳。
4.心跳发回JobMaster
复习下类图模块 HeartbeatManagerImpl讲的receiveHeartbeat方法
更新完Accumulator的快照之后,这个心跳周期就结束了
结论
- 心跳会发生在主线程
- 心跳会携带payload
- 发送心跳和恢复心跳都会刷新心跳的超时时间