SeaTunnel Databend Sink Connector CDC 功能实现详解

WhatsApp协议算法 我想其实有很多人还不太了WhatsApp群控,简单来说,它和我们常使用的微信聊天软件是类似的,只不过它是基于通讯录的,操作起来比较简单便捷,所以现在有很多国家都喜欢用WhatsApp。一般情况下,筛号不会造成账号被封的情况,但是呢,如果筛号的频率太快,就会被系统限制筛号能力,不再返回筛号结果,所以,筛号数量和速度一定要控制好。前天逛街突然灵光一现,为什么不试试多路访问呢,简单来说就是信道复用技术,马上跑回家,调取接口,接入通道,导入已经转换成协议的账号,成功登录! 阅读详情

Databend 是一个面向分析型工作负载优化的 OLAP 数据库,采用列式存储架构。在处理 CDC(Change Data Capture,变更数据捕获)场景时,如果直接执行单条的 UPDATE 和 DELETE 操作,会严重影响性能,无法充分发挥 Databend 在批处理方面的优势。

在 PR #9661 之前,SeaTunnel 的 Databend sink connector 仅支持批量 INSERT 操作,缺乏对 CDC 场景中 UPDATE 和 DELETE 操作的高效处理能力。这限制了在实时数据同步场景中的应用。

核心问题与挑战

在 CDC 场景中,主要面临以下挑战:

  1. 性能瓶颈:逐条执行 UPDATE/DELETE 操作会产生大量的网络往返和事务开销
  2. 资源消耗:频繁的单条操作无法利用 Databend 的列式存储优势
  3. 数据一致性:需要确保变更操作的顺序性和完整性
  4. 吞吐量限制:传统方式难以应对高并发大数据量的 CDC 事件流

解决方案架构

整体设计思路

新的 CDC 模式通过以下创新设计实现高性能数据同步:

graph LR
    A[CDC 数据源] --> B[SeaTunnel]
    B --> C[原始表 Raw Table]
    C --> D[Databend Stream]
    D --> E[MERGE INTO 操作]
    E --> F[目标表 Target Table]

核心组件

1. CDC 模式激活机制

当用户在配置中指定 conflict_key 参数时,connector 自动切换到 CDC 模式:

sink {
  Databend {
    url = "jdbc:databend://databend:8000/default?ssl=false"
    user = "root"
    password = ""
    database = "default"
    table = "sink_table"

    # Enable CDC mode
    batch_size = 100
    conflict_key = "id"
    allow_delete = true
  }
}
2. 原始表设计

系统自动创建一个临时原始表来存储 CDC 事件:

CREATE TABLE IF NOT EXISTS raw_cdc_table_${target_table} (
    id VARCHAR,                    -- 主键标识
    table_name VARCHAR,            -- 目标表名
    raw_data JSON,                 -- 完整的行数据(JSON格式)
    add_time TIMESTAMP,            -- 事件时间戳
    action VARCHAR                 -- 操作类型:INSERT/UPDATE/DELETE
)
3. Stream 机制

利用 Databend Stream 功能监控原始表的变化:

CREATE STREAM IF NOT EXISTS stream_${target_table} 
ON TABLE raw_cdc_table_${target_table}

Stream 的优势:

  • 增量处理:只处理新增的变更记录
  • 事务保证:确保数据不丢失
  • 高效查询:避免全表扫描
4. 两阶段处理模型

第一阶段:数据写入

  • SeaTunnel 将所有 CDC 事件(INSERT/UPDATE/DELETE)以 JSON 格式写入原始表
  • 支持批量写入,提高吞吐量

第二阶段:合并处理

  • 基于 seatunnel AggregatedCommitter 定期执行 MERGE INTO 操作
  • 将原始表的数据合并到目标表

MERGE INTO 核心逻辑

MERGE INTO target_table AS t
USING (
    SELECT 
        raw_data:column1::VARCHAR AS column1,
        raw_data:column2::INT AS column2,
        raw_data:column3::TIMESTAMP AS column3,
        action,
        id
    FROM stream_${target_table}
    QUALIFY ROW_NUMBER() OVER(
        PARTITION BY _id 
        ORDER BY _add_time DESC
    ) = 1 
) AS s
ON t.id = s.id
WHEN MATCHED AND s._action = 'UPDATE' THEN 
    UPDATE SET *
WHEN MATCHED AND s._action = 'DELETE' THEN 
    DELETE
WHEN NOT MATCHED AND s._action != 'DELETE' THEN 
    INSERT *

实现细节

关键代码实现

根据 PR #9661 的实现,主要涉及以下核心类:

DatabendSinkWriter 增强
public class DatabendSinkWriter extends AbstractSinkWriter<SeaTunnelRow, DatabendWriteState> {

    private boolean cdcMode;
    private String rawTableName;
    private String streamName;
    private ScheduledExecutorService mergeExecutor;

    @Override
    public void write(SeaTunnelRow element) throws IOException {
        if (cdcMode) {
            // CDC 模式:写入原始表
            writeToRawTable(element);
        } else {
            // 普通模式:直接写入目标表
            writeToTargetTable(element);
        }
    }

    private void performMerge(List<DatabendSinkAggregatedCommitInfo> aggregatedCommitInfos) {
        // Merge all the data from raw table to target table
        String mergeSql = generateMergeSql();
        log.info("[Instance {}] Executing MERGE INTO statement: {}", instanceId, mergeSql);

        try (Statement stmt = connection.createStatement()) {
            stmt.execute(mergeSql);
            log.info("[Instance {}] Merge operation completed successfully", instanceId);
        } catch (SQLException e) {
            log.error(
                    "[Instance {}] Failed to execute merge operation: {}",
                    instanceId,
                    e.getMessage(),
                    e);
            throw new DatabendConnectorException(
                    DatabendConnectorErrorCode.SQL_OPERATION_FAILED,
                    "Failed to execute merge operation: " + e.getMessage(),
                    e);
        }
    }
}
配置选项扩展

在 DatabendSinkOptions 中新增 CDC 相关配置:

public class DatabendSinkOptions {
      public static final Option<String> CONFLICT_KEY =
            Options.key("conflict_key")
                    .stringType()
                    .noDefaultValue()
                    .withDescription("Conflict key for CDC merge operations");

    public static final Option<Boolean> ALLOW_DELETE =
            Options.key("allow_delete")
                    .booleanType()
                    .defaultValue(false)
                    .withDescription("Whether to allow delete operations in CDC mode");
}

批处理优化策略

系统采用双重触发机制执行 MERGE 操作:

  1. 基于数量:当累积的 CDC 事件达到 batch_size 时触发
  2. 基于时间:seatunnel 的 checkpoint.interval 达到后触发
  if (isCdcMode && shouldPerformMerge()) {
            performMerge(aggregatedCommitInfos);
        }

性能优势

1. 批量处理优化

  • 传统方式:1000 条更新 = 1000 次网络往返
  • CDC 模式:1000 条更新 = 1 次批量写入 + 1 次 MERGE 操作

2. 列式存储利用

  • MERGE INTO 操作充分利用 Databend 的列式存储特性
  • 批量更新时只需扫描相关列,减少 I/O 开销

3. 资源效率提升

  • 减少连接开销
  • 降低事务管理成本
  • 提高并发处理能力

使用示例

完整配置示例

env{
  parallelism = 1
  job.mode = "STREAMING"
  checkpoint.interval = 1000
}

source {
  MySQL-CDC {
   base-url="jdbc:mysql://127.0.0.1:3306/mydb"
   username="root"
   password="123456"
   table-names=["mydb.t1"]
   startup.mode="initial"
  }
}
sink {
  Databend {
    url = "jdbc:databend://127.0.0.1:8009?presigned_url_disabled=true"
    database = "default"
    table = "t1"
    user = "databend"
    password = "databend"
    batch_size = 2
    auto_create = true
    interval = 3
    conflict_key = "a"
    allow_delete = true
  }
}

监控与调试

-- 查看 Stream 状态
SHOW STREAMS;

-- 查看原始表数据量
SELECT COUNT(*) FROM raw_cdc_table_users;

-- 查看待处理的变更
SELECT action, COUNT(*) 
FROM stream_users 
GROUP BY action;

错误处理与容错

1. 重试机制

2. 数据一致性保证

  • 使用 QUALIFY ROW_NUMBER() 确保只处理最新的变更
  • Stream 机制保证不丢失数据
  • 支持 checkpoint 恢复

3. 资源清理

-- 定期清理已处理的原始表数据
DELETE FROM raw_cdc_table_users 
WHERE _add_time < DATEADD(day, -7, CURRENT_TIMESTAMP());

未来优化方向

  1. 智能批处理:根据数据特征动态调整批处理大小
  2. Schema 演进:自动处理表结构变更
  3. 监控指标:集成更完善的性能监控

总结

通过引入 Stream 和 MERGE INTO 机制,SeaTunnel 的 Databend sink connector 成功实现了高性能的 CDC 支持。这一创新方案不仅大幅提升了数据同步性能,还保证了数据一致性和可靠性。对于需要实时数据同步的 OLAP 场景,这一功能提供了强大的技术支撑。

相关链接

关于 Databend

Databend 是一款开源、弹性、低成本,基于对象存储也可以做实时分析的新式湖仓。期待您的关注,一起探索云原生数仓解决方案,打造新一代开源 Data Cloud。

👨‍💻‍ Databend Cloud:databend.cn

📖 Databend 文档:docs.databend.cn

💻 Wechat:Databend

✨ GitHub:github.com/databendlab…

《信息化项目文档模板十二——业务需求新增/变更审批确认表 》 系列文章目录 《信息化项目文档模板一——项目需求说明书》 《信息化项目文档模板二——项目启动会文档模板》 《信息化项目文档模板三——会议纪要模板》 《信息化项目文档模板四——系统项目蓝图设计模板》 《信息化项目文档模板五——系统详细设计模板》 《信息化项目文档模板六——系统详细设计模板》 《信息化项目文档模板七——系统开发计划模板》 《信息化项目文档模板八——系统功能测试模板》 《信息化项目文档模板九——系统压力测试模板》 《信息化项目文档模板十——系统推广上线计划模板》 《信息化项目文档模板十一——系统用 阅读详情

相关推荐

ARM一致性总线CMN600AE

是基于Mesh拓扑结构,对外支持AMBA CHI/ACE-LITE等接口,内部改用路由结构转发数据,并提供硬件一致性和系统缓存,还支持多芯片互联。CMN600在T16FFC上可以做到2Ghz,另外AE版本增加了车规芯片的安全功能,总线内部采用EDC检查,接口采用的奇校验。CMN-600AE具有以下特点:该网络符合功能安全标准,例如ISO 26262(汽车电子领域的功能安全标准)或IEC 61508(工业自动化领域的功能安全标准)等。

weixin_50518899的博客 3501

Flink Oracle CDC Connector详解

Flink Oracle CDC Connector 是一个功能强大且灵活的工具,能够实时捕捉 Oracle 数据库的变更数据,并将其与 Flink 的流处理能力结合,实现高效的数据处理和分析。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-exwa4fbG-1741008279068)(https://via.placeholder.com/600x300.png?text=Flink+Oracle+CDC+性能对比)]

qq_41067796的博客 1639

手把手教你用SlowFast训练自定义手势识别数据集(附FFmpeg抽帧技巧)

本文提供了一份基于SlowFast架构训练自定义手势识别数据集的完整实战指南。文章重点剖析了数据准备的核心挑战,详细讲解了利用FFmpeg进行高、低帧率抽帧的技巧,并介绍了构建半自动标注流水线、生成符合SlowFast要求的AVA格式数据集文件的具体方法。最后,针对手势识别场景,给出了关键的模型训练配置与调优建议,帮助开发者高效完成从数据到模型的全流程。

s1t2u3的博客 909

SeaTunnel(2.3.12)部署及其Demo(含CDC实时采集demo)

SELECT CONCAT('批次 ', start_id, '-', end_id, ': 已插入 ', i - start_id, ' / ', total_to_insert, ' 条记录') AS progress;ID范围: ', start_id, ' 到 ', end_id - 1, ' (共', total_to_insert, '条)') AS batch_complete;5数据过滤:只保留 age>25 的记录(transform中做,实际生成中,必须在这里做数据过滤)

2501_94606749的博客 880

一觉醒后ChatGPT 被淘汰了

近日,AI 界貌似出现了一种新的趋势:自主人工智能。这不是空穴来风,最近一个名为 AutoGPT 的研究开始走进大众视野。特斯拉前 AI 总监、刚刚回归 OpenAI 的 Andrej Karpathy 也为其大力宣传,并在推特赞扬:「AutoGPT 是 prompt 工程的下一个前沿。」

Rocky006的博客 13万+

ubuntu20.04配置UR机械臂的仿真环境

gazebo和rviz中的机械臂的位姿是一样的,要实现同步控制,可以拖动rviz中的球移动到指定位置,点击plan观察路径规划,点击execute执行该路径规划,可以在gazebo和rviz中同步看到刚刚的路径规划运动,实现了简单的机械臂仿真环境搭建。这是因为catkin找的python版本为anaconda下面的版本,所以需要改为指定采用下面的命令,参考之前的。之后要source一下,才能读取到工作空间里的文件,以后每次打开终端进入工作空间都要执行该命令。时,一直不成功,解决办法可以看我之前写的。

weixin_48319333的博客 3492

基于Apache SeaTunnel构建CDC数据同步管道

Apache SeaTunnel是一个数据集成开发平台,其发展经历了几个重要阶段:ETL时代(90年代):面向结构化数据库的数据同步,用于构建数据仓库。MPP和分布式技术流行:使用技术如Hive进行数据仓库的构建。此阶段主要使用mapreduce程序进行数据搬运和转换。数据湖技术流行:重视数据集成,强调先同步数据至数据湖仓储,再进行业务面向的转换和设计。CDC,即变更数据捕获,是一种捕获数据库变更事件(如插入、更新、删除)的技术。

Apache DolphinScheduler开源社区 405

芯片Tapeout前GDS Review | Calibre中如何切出gds中指定区域版图?

芯片Tapeout GDS Review 之Calibre中如何切出指定区域版图GDS

weixin_37584728的博客 1786

Oracle 数据怎么实时同步到 MongoDB | 亲测干货分享建议收藏

摘要: 很多 DBA 同学经常会遇到要从一个数据库实时同步到另一个数据库的问题,同构数据还相对容易,遇上异构数据、表多、数据量大等情况就难以同步。我自己亲测了一种方式,可以非常方便地完成 Oracle 数据实时同步到 MongoDB,跟大家分享一下,希望对你有帮助。 Oracle 数据实时同步到 MongoDB 等非关系型数据库,应该是很多同学的需求了,现在 NOSQL 数据库越来越普遍了。本次亲测的数据同步工具是 Tapdata Cloud,一个永久免费的好东西。 第一步:配置...

java李阳勇的博客 3707

【智能座舱】- 智能座舱研究报告合集

智能座舱研究报告合集

零点壹客的博客 1304

X书x-mini-sig_x-mini-mua

X书的tiny风控代码,成功运行x-mini-sig|x-mini-mua

Codeooo 博客 1万+

Flink1.11中的CDC Connectors操作实践

Flink1.11引入了CDC的connector,通过这种方式可以很方便地捕获变化的数据,大大简化了数据处理的流程。Flink1.11的CDC connector主要包括:MySQL CDC和Postgres CDC,同时对Kafka的Connector支持canal-json和debezium-json以及changelog-json的format。本文主要分享以下内容: CDC简介 Flink提供的 table format 使用过程中的注意点 mysql-cdc的操作实践 canal-json的操

jmx_bigdata的博客 6776

3060台式机 Ubuntu 双系统部署 LingBot-Map 完整指南

摘要: 本文详细介绍了在配备RTX 3060显卡的台式机上部署Ubuntu双系统并安装LingBot-Map 3D重建模型的完整流程。LingBot-Map作为蚂蚁灵波科技开源的Transformer架构模型,在流式3D场景重建中展现出高效性能(20 FPS)和卓越精度(ATE仅6.42米)。指南涵盖关键准备步骤、UEFI分区原理、Ubuntu安装流程(推荐150GB空间及手动分区方案),以及后续驱动配置说明,特别强调RTX 3060需12GB显存支持,并提供了数据备份、Secure Boot处理等实用建议

huanghm88的专栏 307

flink-connector-mysql-cdc编译——flink-1.15.2版本

目前flink cdc的版本不支持flink1.15.*版本,可以自己编译cdc的源码,本文主要介绍编译过程中遇到的问题和需要注意的地方

qq_42418398的博客 7781

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Flink Oracle CDC Connector源码解读

flink cdc是在flink的基础上对oracle的数据进行实时采集,底层使用的是debezium框架来实现,debezium使用oracle自带的logminer技术来实现。logminer的采集需要对数据库和采集表添加补充日志,由于oracle18c不支持对数据添加补充日志,所以目前支持的oracle11、12、19三个版本。

IT_xhf的专栏 4320

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

MySQL-CDC-Connector(Flink SQL CDC Connectors)

Flink SQL CDC Connectors 参见文章(Flink SQL CDC 实践以及一致性分析) Flink SQL CDCFlink SQL CDC Connectors一、安装flink二、配置数据库三、flink客户端操纵1.启动flink客户端2.查看Mysql CDC 同步四、通过flink-connector-mysql-cdc(JAVA代码)监听数据变化 一、安装flink 将flink-sql-connector-mysql-cdc-1.2.0.jar 拷贝至flink l

icefox_zhaoyt的博客 3206

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

浅谈flink-cdc的使用

Flink cdc1.x和2.x区别太大了,如果能升级最好了,不能升级,那么我们怎么避免1.x给我们带来的问题呢? 下面结合我在公司生产的实践,给大家说说。

chenzuoli的博客 1万+

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 114

在Codex 让AI模型 拥有长期智能记忆

本文介绍Claude-Mem V15新功能——智能记忆召回,解决AI遗忘、重复提示、执行不一致等问题。通过本地部署claude-mem,实现自动记录决策(如数据库选型)、跨会话智能召回,支持记忆写入、检索、遗忘全流程闭环。相比传统记忆方案,其基于Hooks自动捕获工具调用,结构化存储,可追溯、可共享、可清理,显著提升工程效率与协作一致性,是长期项目中理想的“工作黑匣子”与“工程脑”。

米莱虾 262

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 192

Docker Compose:搭建本地多服务开发环境

从一个 Java API、PostgreSQL 和 Redis 开始,配置服务名、端口、环境变量、健康检查、数据卷和依赖关系。理解 Compose 文件如何被解析、项目如何隔离,以及哪些数据不能依赖“重建容器”保留,能够把个人开发环境整理成团队可复用的启动入口。

m0_62221377的博客 422

45-存储过程与函数

匿名块跑完就没了,想下次再用只能复制粘贴。给块起个名字存进数据库,就成了存储过程与函数:一次编译、处处调用、权限收口,还能让 Java 侧少拼 SQL。这篇讲封装、调用、限制与排错的完整套路。CREATE OR REPLACE 覆盖式创建,事务由调用方控制;参数三模式 IN 只进、OUT 只出、IN OUT 双向,OUT 参数调用时要备好变量接;调用三姿势 EXEC、CALL、匿名块,命名传参=>最清晰;函数必有 RETURN,想在 SQL 里调用就不能碰 DML 和事务控制;

yuhou25的博客 152

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 386

数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南

Oracle 提供了ORA_ROWSCN伪列(System Change Number),记录最后修改行的 SCN,类似 PostgreSQL 的xmin。实践中通常仍使用 version 字段方案,逻辑与 MySQL 完全相同。-- Oracle:通过 ORA_ROWSCN 实现乐观锁-- 更新时比对 SCN// 自定义注解// AOP 切面@Aspect@Component@Slf4jtry {

yjc_1111的专栏 395

数据库主键选型指南:BIGINT vs VARCHAR

主键选型关乎数据库性能与架构演进。BIGINT(如雪花算法)在顺序写入、二级索引开销和分布式生成上优势显著,适合高并发核心链路;而传统 VARCHAR UUIDv4 因随机性导致频繁页分裂、存储膨胀,性能堪忧。UUIDv7 通过时间戳有序性实现高效追加写入,结合 BINARY(16) 存储可兼顾性能与安全,成为现代微服务新选择。关键在于:主键应稳定、无业务含义,优先选用趋势递增的紧凑类型,并根据场景合理采用双主键模式或 ULID 等替代方案。

小李同学的博客 300

自动化运维选型:四条技术路线的能力边界,以及它们为什么不能互相替代

自动化运维怎么选型?拆解配置管理、基础设施即代码、作业调度与场景化编排四条技术路线边界,分析账本归属与时间语义差异,给出四种架构组合与判断点,帮企业看清为何不能互相替代。

trainsignalcn的专栏 308
上一篇: Databend 向量索引:加速 AI 应用的数据引擎
下一篇: Databend 亮相 DTCC 2025:存算分离架构引领湖仓一体化
Databend
博客等级 码龄5年 1458粉丝 362原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值