• 检查是否有变更发生在 Flink CDC 作业运行期间,比如表结构或 CDC 配置的变更,导致原本应该是 INSERT_ONLY 的表出现了 UPDATE_BEFORE 记录。 旧数据重复处理: • 如果作业曾经使用过全量同步模式,后来改为 INSERT_ONLY 模式,但历史数据中的 UPDATE_BEFORE 记录仍然存在于 Kafka 等中间存储中,Flink 作业重新消...
private StringData rowKind2String(RowKind rowKind) { switch (rowKind) { case INSERT: case UPDATE_AFTER: return OP_INSERT; case UPDATE_BEFORE: case DELETE: return OP_DELETE; default: throw new UnsupportedOperationException( "Unsupported operation '" + rowKind + "' for row kind."); } }分...
就是对应数据库的一个update操作,update_before是前镜像值,update_after是后镜像值,比如将mysql中一行数据的一个字段从'aa'改成'bb',那对应的两条记录就是 [-U, (key, aa)] [+U,(key, bb)], flink sql 里是将一个update操作拆分成两条记录处理的,有些同步工具里则是记录成一条。
MySQL的CDC流结合where条件过滤使用时,update类型的数据会发送update_before和update_after两条数据到下游,update_before数据到下游会被识别为DELETE操作,需要用户具有DELETE权限。 解决方案 检查SQL逻辑是否存在retract相关操作,如果存在相关操作,给结果表的操作用户赋予DELETE权限。
update message推导过程: updsertSink假设只接受Update_After消息,那么他就会告诉频次统计的Aggregate,只发送Update_After消息即可。sink编写时确定接受消息类型。 Aggregate知道前一层会发送:update_before和update_after,而自身也需要两种消息,那么就会通知Calc节点同时发送两种消息,其实Calc节点是不会产生消息,只会透传的。
Flink还支持将Flink SQL中的INSERT、UPDATE或DELETE消息编码为Canal格式的JSON消息,输出到Kafka等存储中。 重要 目前Flink还不支持将UPDATE_BEFORE和UPDATE_AFTER合并为一条UPDATE消息。因此,Flink将UPDATE_BEFORE和UPDATE_AFTER分别编码为DELETE和INSERT类型的Canal消息。
Flink SQL的window计算除了window结束后触发计算之外,还支持中途输出window中间累加结果以及对迟到的数据修正window累加结果(以回撤形式输出:先输出UPDATE_BEFORE旧值然后输出UPDATE_AFTER新值)。 目前版本Flink 1.15 master分支代码中这些为实验特性。下面从配置参数入手,分析下上述功能的实现原理。
UPDATE_BEFORE("-U", (byte) 1), UPDATE_AFTER("+U", (byte) 2), DELETE("-D", (byte) 3); } 1. 2. 3. 4. 5. 6. 结论: 聚合算子和Sink算子关于回撤的概念相似,但原理不同且使用场景也不同,聚合算子的回撤用于聚合状态的更新,Sink算子的回撤则更多的是应用于CDC场景。
| B | 1 | UPDATE_BEFORE| +---+---+---+ +---+---+---+ | level | uv | RowKind | +---+---+---+ | B | 2 | UPDATE_AFTER| +---+---+---+
MySQL的CDC流结合where条件过滤使用时,update类型的数据会发送update_before和update_after两条数据到下游,update_before数据到下游会被识别为DELETE操作,需要用户具有DELETE权限。 解决方案 检查SQL逻辑是否存在retract相关操作,如果存在相关操作,给结果表的操作用户赋予DELETE权限。