赞
踩
入口是FlinkTableSink,继承自FlinkTableSinkBase
然后到了FlinkSinkBuilder的build()
以buildForFixedBucket为例
- FixedBucketSink extends FlinkWriteSink<InternalRow>
- 而 FlinkWriteSink<T> extends FlinkSink<T>
所以代码走到了FlinkSink 的sinkFrom()
分别调用了doWrite()和doCommit()
doWrite()调用了createWriteOperator,java类的继承机制这个实现又回到了子类FixedBucketSink类
注意此时父类doWrite()里传参的时候调用了createWriteProvider()返回StoreSinkWrite.Provider
接着上面代码RowDataStoreWriteOperator类,里面有一个processElement()
RowDataStoreWriteOperator继承TableWriteOperator,这个类又通过provider初始化了write,RowDataStoreWriteOperator类刚才用到了父类TableWriteOperator的write对象
以StoreSinkWrite.Provider是StoreSinkWriteImpl为例,那上面的write()实际调用就是这个类的write()
StoreSinkWriteImpl类又有一个write对象=> FileStoreWrite
FileStoreWrite其中一个子类AbstractFileStoreWrite需要细看,这次简单看下
其中一部分是用了RecordWriter去写数据
最终走到了MergeTreeWriter的write(),判断内存是否满了,满了就溢出磁盘
flushWriteBuffer()做了很多,包括判断是否需要进行等待上一次compact结束、数据flush、保存一些信息方便checkpoint、尝试触发一次新的compact
writeBuffer.forEach这段keyComparator,mergeFunction两个对象是传参进来的
Comparator看起来是一个比较器
mergeFunction对应paimon的几个primary key表类型
doCommit()时new了一个CommitterOperator(),
这个类主要有几个方法
commiter.commit的逻辑是将所有的flush信息进行一次commit操作,最终flush信息会被序列化成json信息保存在snapshot文件中,当commit成功后,Paimon表会新增一次snapshot
下次介绍抽象类和合并提交具体代码
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。