1 flink Dynamic Table & ChangeLog Stream 了解吗?

土哥、FLINK群-谢帮桂提供

Dynamic Table 是 Flink SQL 定义的动态表,动态表和流的概念是对等的参照上图,流可以转换成动态表,动态表也可以转换成流。如果把有界数据比作表,则无界数据流比作一个不断append数据的动态表,与之配套的概念是”连续查询”,即每次append数据会源源不断更新视图并输出查询结果。 在 Flink SQL 中,数据从一个算子以 Changelog Stream 的形式流向另外一个算子时,任意时刻的 Changelog Stream 可以翻译为一个表,也可以翻译为一个流。

2 mysql 表与 binlog 的关系是什么?

土哥、大数据技术交流2群-海绵、FLINK群-谢帮桂、飛鳥與魚提供

MySQL 数据库的一张表所有的变更都记录在 binlog 日志中,如果一直对表进行更新,binlog 日志流也一直会追加,数据库中的表就相当于 binlog 日志流在某个时刻点物化的结果;日志流就是将表的变更数据持续捕获的结果。 ChangeLog:changelog实际上是每一条数据的变更日志,对于无界数据的流处理,一般上游存在,INSERT 、 UPDATE 、 DELETE这些事件,如果单纯往下游append数据是最理想情况,但是数据传给下游除了append之外还存在更新和删除等流的处理场景,要求下游要同步变更就需要下游识别上游数据,可识别delete叫回撤流(Retract),只识别更新叫 Upsert 流,通常要求下游提供主键来进行ChangeLog对数据行的变更。redolog是预写日志,且是Innodb引擎实现的,binlog只在事务commit时写入,是mysql Server级的实现。这个就可以关联出Flink CDC中MySQL与Oralce的实现不同,一个基于binlog,一个基于redolog及归档,所以oralce CDC是识别了事务的,只有Commit的数据会下发到flink

3 flink cdc 底层的采集工具用哪个?

大数据技术交流2群-海绵、FLINK群-谢帮桂提供

flink cdc底层的工具是 debezium,其他同步工具还有canal、maxwell等。目前flink kafka connector支持识别debezium-json、canal-json格式的数据消息,这里利用这个特点进行数据ChangeLog的消息传递。

4 state的生命周期是在job结束。还是在jobmanger结束的,如果一个job运行时候还没做ck,这时候取消作业,他的state会销毁吗?还是会在内存里等待ck的到来。假如设置5分钟,2分钟就直接取消作业,它的state还在内存吗(FLINK群-谢帮桂提供的问题)

土哥、FLINK群-谢帮桂、🙃 ɹǝ nᴉx、念想、王了个博、ડꪊꪀེꦿ๑҉-初心ヾ½讨论:

image.png ckpoint机制会定期的持久化的状态数据,对于不同的StateBackend,工作state保存的地方也不同,MemoryStateBackend与FsStateBackend将工作state保存在TaskManager的内存中,RocksDBStateBackend将工作state保存在RocksDB中。

首先在 checkpoint 时,先在数据流的 source 端插入 checkpoint barrier, 每到一个算子时,这时这个算子会短暂暂停自己的工作,算子进行 state 的同步快照 和异步保存在状态后端中。也就是说,每执行到一个算子时,这时候进行checkpoint ,然后就会将该算子checkpoint 的state 保存到 state backend 里面。

  1. souce:使用执行 ExactlyOnce 的数据源,比如 kafka 等。
  2. 内部使用 FlinkKafakConsumer,并开启 CheckPoint,偏移量会保存 到 StateBackend 中,并且默认会将偏移量写入到 topic 中去,即 _consumer_offsets Flink 设置 CheckepointingModel.EXACTLY_ONCE
  3. sink:存储系统支持覆盖也即幂等性:如 Redis,Hbase,ES 等 存储系统。
    不支持覆:需要支持事务(预写式日志或者两阶段提交),两阶段提交可 参考 Flink 集成的 kafka sink 的实现。