从数据格式转换的角度 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 对应。

为什么要这么对应?

相关推荐
baopixiaoz14 小时前
AI量化策略师|Web3 量化交易研究员
大数据·人工智能·python·区块链
IT古董14 小时前
【WMS学习笔记系列】01-需求分析
大数据·数据库
成长之路51414 小时前
【数据集】MD&A管理层讨论与分析文本(2001-2025年)
大数据
浅念-16 小时前
MySQL 索引底层完整详解|磁盘Page|B+树推导|聚簇非聚簇索引|索引SQL操作
大数据·数据库·b树·sql·mysql·面试·职场和发展
小马过河R16 小时前
数据仓库入门:是什么、怎么做、和数据库有什么区别?
大数据·数据库·数据仓库·架构·驾驭工程·fde
leisoo809716 小时前
涨停板次日表现因子怎么挖掘本地化Python全流程实战
大数据·人工智能·python
用户36105886261217 小时前
SparkSQL 数据源与底层架构深度剖析
大数据·spark
用户36105886261217 小时前
SparkSQL 之 DataFrame 与 DataSet 及实操演练
大数据·spark
GEO_youxuan19 小时前
AI财务分析软件到底是“自动出表“还是“决策推演“?从自动出表到决策推演的能力分层与选型逻辑
大数据·人工智能
星如雨グッ!(๑•̀ㅂ•́)و✧19 小时前
大模型知识点总结01
大数据·ai