从数据格式转换的角度 flink cdc 如何写入paimon?

从一个测试用例着手

org/apache/flink/cdc/connectors/paimon/sink/v2/PaimonSinkITCase.java

java 复制代码
public void testSinkWithDataChange(String metastore, boolean enableDeleteVector)
            throws IOException, InterruptedException, Catalog.DatabaseNotEmptyException,
                    Catalog.DatabaseNotExistException, SchemaEvolveException {
         // 初始化paimon的元数据
        initialize(metastore);
                      // 创建paimonSink
        PaimonSink<Event> paimonSink =
                new PaimonSink<>(
                        catalogOptions, new PaimonRecordEventSerializer(ZoneId.systemDefault()));
        PaimonWriter<Event> writer = paimonSink.createWriter(new MockInitContext());
        Committer<MultiTableCommittable> committer = paimonSink.createCommitter();

        // insert
        writeAndCommit(
                writer, committer, createTestEvents(enableDeleteVector).toArray(new Event[0]));
        Assertions.assertThat(fetchResults(table1))
                .containsExactlyInAnyOrder(
                        Row.ofKind(RowKind.INSERT, "1", "1"), Row.ofKind(RowKind.INSERT, "2", "2"));

        // delete
        writeAndCommit(
                writer,
                committer,
                generateDelete(
                        table1, Arrays.asList(Tuple2.of(STRING(), "1"), Tuple2.of(STRING(), "1"))));

        Assertions.assertThat(fetchResults(table1))
                .containsExactlyInAnyOrder(Row.ofKind(RowKind.INSERT, "2", "2"));

        // update
        writeAndCommit(
                writer,
                committer,
                generateUpdate(
                        table1,
                        Arrays.asList(Tuple2.of(STRING(), "2"), Tuple2.of(STRING(), "2")),
                        Arrays.asList(Tuple2.of(STRING(), "2"), Tuple2.of(STRING(), "x"))));
        Assertions.assertThat(fetchResults(table1))
                .containsExactlyInAnyOrder(Row.ofKind(RowKind.INSERT, "2", "x"));

        if (enableDeleteVector) {
            Assertions.assertThat(fetchMaxSequenceNumber(table1.getTableName()))
                    .containsExactlyInAnyOrder(
                            Row.ofKind(RowKind.INSERT, 1L), Row.ofKind(RowKind.INSERT, 3L));
        } else {
            Assertions.assertThat(fetchMaxSequenceNumber(table1.getTableName()))
                    .containsExactlyInAnyOrder(
                            Row.ofKind(RowKind.INSERT, 1L),
                            Row.ofKind(RowKind.INSERT, 2L),
                            Row.ofKind(RowKind.INSERT, 3L));
        }
    }

整体流程:

  1. 创建变更事件。

  2. 创建PaimonWriter

  3. 对于每一个事件event,都调用paimonWriter中的write。具体又包括以下几个步骤

    • 序列化event为paimon 中的数据格式genericRow
    • 创建paimon的write算子(StoreSinkWrite),将genericRow写入paimon表. 进入paimon内部的写入逻辑。
      • 从每一条row中提取rowkind(INSERT,UPDATE_BEFORE,UPDATE_AFTER,DELETE)
      • 提取data,MergeTreeWriter中执行两个操作,内存够,就把数据put到内存,内存不够就flush到磁盘

源码

Flink cdc 代码

  • 创建测试data change event
  • 遍历事件
  • 序列化
  • 核心转换逻辑
  • paimon的写入

以下是paimon的代码

总结

回到本文的标题:从数据格式转换的角度 flink cdc 如何把数据处理成paimon?

在flink cdc端 核心是 convertEventToGenericRow,处理dataChangeEvent 和 genericRow 对应。

为什么要这么对应?

相关推荐
信安IT租赁18 分钟前
本地化部署的AI营销CRM:基于事件驱动的全流程自动化状态机实践
大数据·人工智能·软件工程
AgentMaster26 分钟前
元数据、血缘、质量、安全四大模块能力拆解,数据治理方案对比:4 种技术路线深度评测
大数据·数据库·数据仓库·人工智能·原型模式
Raas10030 分钟前
AI网关和OpenRouter区别在哪?MAI Gateway(魔芋企业级AI网关)统一治理方案深度解析
大数据·人工智能·gateway·ai网关·mai gateway
海兰40 分钟前
Elasticsearch ES|QL:让全文本搜索无处不在
大数据·elasticsearch·jenkins
智购科技自动贩卖机44 分钟前
自动售货机嵌入式系统安全加固实践:从Go语言国密算法到硬件防拆的工程化落地
大数据·人工智能·后端·安全·golang·系统安全
TDengine (老段)1 小时前
TDgpt 概览 — AI 增强的时序数据库
大数据·数据库·人工智能·物联网·时序数据库·iot·tdengine
IT研究室1 小时前
最新大数据毕业设计选题推荐-基于大数据的城市空气污染物浓度数据分析与可视化-大数据-Spark-Hadoop-Bigdata
大数据·数据分析·课程设计
starzy19903 小时前
Flink基础之Session-Cluster原理详解:共享集群的利与弊
大数据·flink
starzy19903 小时前
Flink基础之Per-Job-Cluster原理详解:被 Application 取代的模式
java·大数据·flink
大大大大晴天10 小时前
每天认识一个组件:数据治理Apache Atlas
大数据