一图读懂:Flink CDC如何流式写入Paimon?
以Mysql CDC至Paimon为例
整体架构
-
MySQL CDC SourceSnapshotReader读取快照全量数据,BinlogReader读取增量数据。
-
paimon sink 实现桶级别的写入,compactManager实现异步compaction
-
comitter 单例模式负责提交和过期快照
流程
第一步:当source端读取 到全量快照数据和增量数据,发送到下游sink
第二步:sink端获取到数据,先在在内存LSM tree中缓存,当内存满了以后flush到磁盘中。
注意:此时并没有创建snapshot,当flink 写入checkpoint时,paimon sink会把所有缓从中的记录刷写到磁盘,并且发送一个committable 消息给下游。下游Committer Operator read during checkpoint。
第三步:checkpoint期间,commiter operator 会创建一个新的snapshot 和manifest关联起来,所以一个snapshot包含了一个表的所有信息。
第四步:这一步是被触发的。异步执行的。CompactManager 生成的committable包含previous files 和 merged files ,所以Commiter Operator可以构造相应的manifest。
这种情况下,Commiter Operator在checkpoin期间可能生成两份快照,一份是数据写入(Append类型的快照),另外一份是compact快照。如果在checkpoint期间没有写入数据文件,就只会创建Compact类型的快照。Committer Operator将检查快照是否过期,并对标记的数据文件执行物理删除。
参考文献:
https://paimon.apache.org/docs/0.8/learn-paimon/understand-files/#flink-stream-write