flink写入paimon流程代码

入口是FlinkTableSink,继承自FlinkTableSinkBase

flink写入paimon流程代码_第1张图片

flink写入paimon流程代码_第2张图片

然后到了FlinkSinkBuilder的build()

flink写入paimon流程代码_第3张图片

以buildForFixedBucket为例

flink写入paimon流程代码_第4张图片

FixedBucketSink extends FlinkWriteSink
而 FlinkWriteSink extends FlinkSink 

所以代码走到了FlinkSink 的sinkFrom()

flink写入paimon流程代码_第5张图片

分别调用了doWrite()和doCommit()

flink写入paimon流程代码_第6张图片

flink写入paimon流程代码_第7张图片

doWrite()调用了createWriteOperator,java类的继承机制这个实现又回到了子类FixedBucketSink类

flink写入paimon流程代码_第8张图片

注意此时父类doWrite()里传参的时候调用了createWriteProvider()返回StoreSinkWrite.Provider

flink写入paimon流程代码_第9张图片

flink写入paimon流程代码_第10张图片

接着上面代码RowDataStoreWriteOperator类,里面有一个processElement()

flink写入paimon流程代码_第11张图片

RowDataStoreWriteOperator继承TableWriteOperator,这个类又通过provider初始化了write,RowDataStoreWriteOperator类刚才用到了父类TableWriteOperator的write对象

flink写入paimon流程代码_第12张图片

flink写入paimon流程代码_第13张图片

以StoreSinkWrite.Provider是StoreSinkWriteImpl为例,那上面的write()实际调用就是这个类的write()

flink写入paimon流程代码_第14张图片

StoreSinkWriteImpl类又有一个write对象=> FileStoreWrite

FileStoreWrite其中一个子类AbstractFileStoreWrite需要细看,这次简单看下

其中一部分是用了RecordWriter去写数据

flink写入paimon流程代码_第15张图片

最终走到了MergeTreeWriter的write(),判断内存是否满了,满了就溢出磁盘

flink写入paimon流程代码_第16张图片

flushWriteBuffer()做了很多,包括判断是否需要进行等待上一次compact结束、数据flush、保存一些信息方便checkpoint、尝试触发一次新的compact

flink写入paimon流程代码_第17张图片

writeBuffer.forEach这段keyComparator,mergeFunction两个对象是传参进来的

flink写入paimon流程代码_第18张图片

Comparator看起来是一个比较器

flink写入paimon流程代码_第19张图片

mergeFunction对应paimon的几个primary key表类型

flink写入paimon流程代码_第20张图片

doCommit()时new了一个CommitterOperator(),

这个类主要有几个方法

flink写入paimon流程代码_第21张图片

flink写入paimon流程代码_第22张图片

flink写入paimon流程代码_第23张图片

commiter.commit的逻辑是将所有的flush信息进行一次commit操作,最终flush信息会被序列化成json信息保存在snapshot文件中,当commit成功后,Paimon表会新增一次snapshot

下次介绍抽象类和合并提交具体代码

你可能感兴趣的:(flink,大数据,paimon)