wgcn_bj

导航

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

封面图片不要使用微信打开文章,可以使用手机/电脑浏览器

前言

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

类图依赖关系

先上个心跳实现的类图

image-20211028214548092

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

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

image-20211029152150636

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

image-20211029152106283

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

image-20211029153850265

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

image-20211029155205083

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

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

image-20211028223046524

2.requestHeartbeat 方法

image-20211029174754545

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

image-20211029150543649

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

image-20211028223831984

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

image-20211029144441510

HeartbeatMonitorImp :HeartbeatMonitor的实现类

HeartbeatListener :

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

2.心跳超时的回调

image-20211028224700816

JobMaster与Taskmanager之间的心跳流程

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

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

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

image-20211029110106766

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

image-20211028225153168

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

image-20211029200443626

2.定时发送

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

image-20211029205643340

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

image-20211029202743117

3.Taskmanager 的实现

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

image-20211029121000675

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

image-20211029203256406

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

image-20211029121549502

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

image-20211029204300440

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

image-20211029122348998

4.心跳发回JobMaster

image-20211029204626777

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

image-20211029125208497

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

image-20211029125354166

结论

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

posted on 2022-01-31 19:17  wgcn_bj  阅读(133)  评论(0编辑  收藏  举报