flink yarn 资源预估 flink 源码_类图

前言

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

类图依赖关系

先上个心跳实现的类图

flink yarn 资源预估 flink 源码_flink yarn 资源预估_02

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

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

flink yarn 资源预估 flink 源码_主线程_03

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

flink yarn 资源预估 flink 源码_类图_04

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

flink yarn 资源预估 flink 源码_flink yarn 资源预估_05

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

flink yarn 资源预估 flink 源码_重置_06

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

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

flink yarn 资源预估 flink 源码_主线程_07

2.requestHeartbeat 方法

flink yarn 资源预估 flink 源码_主线程_08

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

flink yarn 资源预估 flink 源码_类图_09

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

flink yarn 资源预估 flink 源码_重置_10

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

flink yarn 资源预估 flink 源码_主线程_11

HeartbeatMonitorImp :HeartbeatMonitor的实现类

HeartbeatListener :

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

2.心跳超时的回调

flink yarn 资源预估 flink 源码_主线程_12

JobMaster与Taskmanager之间的心跳流程

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

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

![image-20211028222134977](https://gitee.com/wgcn_bj/pic_bed/raw/master/img/image-20211028222134977.png

flink yarn 资源预估 flink 源码_flink yarn 资源预估_13

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

flink yarn 资源预估 flink 源码_重置_14

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

flink yarn 资源预估 flink 源码_flink yarn 资源预估_15

2.定时发送

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

flink yarn 资源预估 flink 源码_主线程_16

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

flink yarn 资源预估 flink 源码_类图_17

3.Taskmanager 的实现

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

flink yarn 资源预估 flink 源码_flink yarn 资源预估_18

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

flink yarn 资源预估 flink 源码_主线程_19

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

flink yarn 资源预估 flink 源码_主线程_20

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

flink yarn 资源预估 flink 源码_重置_21

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

flink yarn 资源预估 flink 源码_类图_22

4.心跳发回JobMaster

flink yarn 资源预估 flink 源码_重置_23

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

flink yarn 资源预估 flink 源码_重置_24

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

flink yarn 资源预估 flink 源码_flink yarn 资源预估_25

结论

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