🗒️FlinkCDC|如何判断全量阶段完成?
2023-7-13
| 2023-7-17
字数 924阅读时长 3 分钟
type
status
date
slug
summary
tags
category
icon
password
在 FlinkCDC 群里经常看到这么一个问题,这应该也是大部分用户的刚接触的主要疑问,一种方案是根据日志来判断,根据代码,在 JobManager 会打印这么一段日志:
然而根据日志来判断太麻烦,有没有更智能的方案呢?其实这个问题在官方 2.1 发版的时候就有说明:
其中,currentEmitEventTimeLag 指标记录的是 Source 发送一条记录到下游节点的时间点和该记录在 DB 里产生时间点差值,用于衡量数据从 DB 产生到离开 Source 节点的延迟。用户可以通过该指标判断 source 是否进入了 binlog 读取阶段:
  • 即当该指标为 0 时,代表还在全量历史读取阶段;
    • notion image
  • 当大于 0 时,则代表进入了 binlog 读取阶段。
    • notion image
所以可以通过拉取这个指标判断任务是否完成了全量阶段。
(不过目前这个指标展示仍有问题,需要等待这个pr[]解决以后才生效)

源码

我们简单的浏览一下这个指标的代码实现。
全局搜索 currentEmitEventTimeLag 这个字段,找到指标被创建的代码
接下来去看下 emitDelay 变量的定义,EmitTime - messageTimestamp 就是发送一条记录到下游节点的时间点和该记录在 DB 里产生时间点差值。
然后看下这两个时间是怎么产生的,找到 reportMetrics 方法。
可以看到,EmitTime 是取程序运行发送数据的时间,那么 messageTimestamp 呢?
看下 getMessageTimestamp 方法:
messageTimestamp 是从记录里的 source.ts_ms 字段取出来的,而这个参数就需要追溯到 debezium 的代码了。
在 Debezium 中,source.ts_ms 是一个代表数据库表中特定行最后更新时间戳的字段。因此通过计算 EmitTime - messageTimestamp 可以得到数据从写入源库到被 cdc 发送到下游的时间差。
那么,为什么全量阶段的 currentEmitEventTimeLag 值是0呢,我们可以看下 reportMetrics 方法的调用时机:
原来做了一个判断处理,只有 DataChangeRecord 类型的数据才会更新这个指标,也就是增量数据阶段。
 
FlinkCDC|FAQ整理浏览器插件开发
Loading...
目录