Apache Paimon-SourceSink实现(杂记)
Consumerid+primarykey+fixed bucket
Source
MonitorSource
主要负责读取快照,下发datasplit到下游Operator。
snapshot时将快照id存储,之后在notifyComplete时将consumerid写入。
pollNext时会将splits(元数据信息)下发到下游readerOperator,通过readerBuilder.scan.plan.split
。由于readbuilder在创建时已经将flink的各种filter已经传进来,因此在plan时会根据元数据里面的信息进行一大波的过滤。
ReadOperator
Datasplit下发到readerOperator之前会将根据partition+bucket信息进行shuffle确保相同分区+bucket的数据发向对应的ReaderOperator。
readerOperator主要是根据datasplit中信息读取真正的数据文件,以及上报一些metrcis(ps:SOURCE_IDLE_TIME是我实现的)在读取真正数据文件时也会根据一些过滤条件进行过滤,例如:fileindex或者delevectors。
Sink
RowDataStoreWriteOperator
主要将数据写入到磁盘,以及做compaction其中compaction中还有一些快照过期等操作。
写数据时,会首先写入writerbuffer中(此处调用sun.misc.Unsafe使用的堆外内存自己管理释放),如果buffer满了之后在flush到磁盘,另外在snapshotshot之前会强制flush到磁盘。写入数据时会根据不同的mergerfunction进行合并。写入changelog时会根据changlog producer,Input模式会直接写入,none不写入,lookup以及fullcompaction时会在compaction时写入数据。
CommitterOperator
主要将上游产出的元数据写入到磁盘。
在processElement时会首先将上游传来的数据存储到内存里Deque
在Snapshot时把内存中的所有 Committable 根据 CheckpointId 来做聚合成一些ManifestCommittable。之后存到state里面。
notifyComplete时,会将元数据信息提交到外部存储。在提交时还会有一些冲突检测,如果snapshot冲突(两个writer同时写)会抛弃这次写入,在写一次并且合并上次snapshot产出的元数据文件(paimon实现是一个while(true)的循环)。
File冲突,主要是因为compaction时标记量文件为逻辑删除,例如上个快照已经标记某个file文件为逻辑删除状态了,当前状态中又标记了某文件为逻辑删除,这会产生不一致,因此需要重启,抛弃这次的compaction快照。
评论已关闭