首页 > 其他分享 >Paimon的写入流程

Paimon的写入流程

时间:2023-06-23 21:23:19浏览次数:27  
标签:流程 写入 write only apache org paimon Paimon

基于Paimon 0.5版本

写入流程的构建org.apache.paimon.flink.sink.FlinkSinkBuilder#build
算子的流向
BucketingStreamPartitioner 分区 -> RowDataStoreWriteOperator 写入 -> CommitterOperator 提交

Primary key表写入

BucketingStreamPartitioner 根据数据的bucket和partition计算应该发送的通道
RowDataStoreWriteOperator#processElement
StoreSinkWriteImpl(StoreSinkWrite)#write
org.apache.paimon.operation.AbstractFileStoreWrite#write
org.apache.paimon.operation.KeyValueFileStoreWrite#createWriter 创建writer MergeTreeWriter
org.apache.paimon.mergetree.MergeTreeWriter#write
org.apache.paimon.mergetree.SortBufferWriteBuffer#put 添加到buffer
BinaryInMemorySortBuffer/BinaryExternalSortBuffer#write 序列化后写入buffer
org.apache.paimon.mergetree.MergeTreeWriter#flushWriteBuffer 内存满后 刷写writeBuffer. 遍历buffer 应用merge函数, 并创建level 0的 file writer, 将数据写入到datafile中. 如果同时配置了Changelog producer是input,那么会将原始的数据写出到Changelog文件中

Append-only表写入

Append-only的表是没有Pk的表, 在创建表的时候就已经根据pk和write-mode参数确定了表的类型, 一般来说,没有PK的就是Append-only的表, Append-only的表意味着不处理变更流的数据

WriteMode writeMode = coreOptions.get(CoreOptions.WRITE_MODE);
if (writeMode == WriteMode.AUTO) {
    writeMode =
            tableSchema.primaryKeys().isEmpty()
                    ? WriteMode.APPEND_ONLY
                    : WriteMode.CHANGE_LOG;
    coreOptions.set(CoreOptions.WRITE_MODE, writeMode);
}
if (writeMode == WriteMode.APPEND_ONLY) {
    table = new AppendOnlyFileStoreTable(fileIO, tablePath, tableSchema);
} else {
    if (tableSchema.primaryKeys().isEmpty()) {
        // 没有PK但是设置了写入模式是Changelog类型, 会将全列作为主键, 并记录出现的次数来进行回撤
        table = new ChangelogValueCountFileStoreTable(fileIO, tablePath, tableSchema);
    } else {
        table = new ChangelogWithKeyFileStoreTable(fileIO, tablePath, tableSchema);
    }
}

org.apache.paimon.operation.AbstractFileStoreWrite#write
org.apache.paimon.operation.AppendOnlyFileStoreWrite#createWriter 创建AppendOnlyWriter
org.apache.paimon.io.RollingFileWriter#write append-only 表直接写文件了, 没有pk表中的write buffer

标签:流程,写入,write,only,apache,org,paimon,Paimon
From: https://www.cnblogs.com/Aitozi/p/17500201.html

相关文章

  • JS(运算符、流程控制)
    一运算符(操作符)1运算符的分类运算符(operator)也被称为操作符,是用于实现赋值、比较和执行算数运算等功能的符号。JavaScript中常用的运算符有:算数运算符递增和递减运算符比较运算符逻辑运算符赋值运算符2算数运算符算术运算符概述概念:算术运算使用的符号,用于执......
  • 【人工智能技术专题】「入门到精通系列教程」零基础带你掌握人工智能全流程技术体系和
    前言人工智能是一个庞大的研究领域。虽然我们已经在人工智能的理论研究和算法开发方面取得了一定的进展,但是我们目前掌握的能力仍然非常有限。机器学习是人工智能的一个重要领域,它研究计算机如何模拟或实现人类的学习行为,以获取新的知识或技能,并通过重新组织已有的知识结构来不断提......
  • 研发流程不只是一个流程
    以人治天下,贤则大治,不贤则大乱。以术知天下,术高多宵小。以法治天下,法令莫不从,民生定。一、总要有个流程作为一个研发,你最讨厌什么?"小功能,十分钟能搞定吧!""需求都清楚了吧,明天老板要看效果!""有个急事,插一下!""这个地方,还要调整下,稍后给你更新的文档!""这个当初肯定不是这样......
  • nginx 的模块及处理流程
        nginx的内部结构是由核心部分和一系列的功能模块所组成。这样划分是为了使得每个模块的功能相对简单,便于开发,同时也便于对系统进行功能扩展。这样的模块化设计类似于面向对象中的接口类,它增强了nginx源码的可读性、可扩充性和可维护性。nginx的4种角色模块Nginx模块主要有......
  • TreeSaver.js 的工作流程逻辑
    Treesaver是浏览器大小尺寸敏感(size-sensitive)的,会就着当前的浏览器尺寸(browsersize),选用不同的分栏表格(grid)做排版。初始化TreeSaver.js框架的入口源代码在后面可以看到:https://github.com/Treesaver/treesaver/blob/master/src/init.js这里的代码用到了Google开发的JS库:Closur......
  • Android系统服务 AMS 启动流程
    背景当SystemServer启动的时候,从Zygote进程fork()出SystemServer进程,经过初始化后,会通过反射调用SystemServer.java的mian()方法,其中会启动一系列系统服务。AMS就是其中的一个。一、缘起SystemServer进程SystemServer的main():/***Themainentrypointfromzygote......
  • 20230428 24. 职责链模式 - 审批流程
    介绍职责链模式(ChainofResponsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。Handler类,定义一个处理请示的接口ConcreteHandler类,具体处理者类,处理它所负责的请......
  • Android Xml文件生成,Xml数据格式写入
    生成xml文件格式数据,Android提供了Xml.newSerializer();,可以理解为Xml序列化;序列化:把内存里面的数据(file,databases,xml等等)丢给某一个地方; 反序列化:把某个地方的数据(file,databases,xml等等),拿到内存中;既然是Android操作Xml,就用Android所提供的API,不用Java所提供的API,DOM......
  • 【代码设计】链表结构解决多流程校验
    目的使用合理的代码设计,解决业务场景的中的实际问题。背景介绍在实际的业务场景中,用户的一个操作行为,是否允许真正被执行,往往会涉及到多流程的校验,一旦有条件不满足将会被中止。以下面流程图为例:用户点击了打赏按钮,会进行是否有网络检查,没有网络,会有网络连接弹框,等待用户连接结果......
  • Android | Activity 启动流程分析
    前言Activity类是android应用的关键组件,在日常开发中,绝对少不了组件。既然用了这么久,你知道他的启动流程......