暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

中电信翼康工程师:我在 Apache SeaTunnel 社区的贡献之旅

SeaTunnel 2024-10-28
118

贡献者Github ID:luckyLJY

文章整理:曾辉

Apache SeaTunnel 作为一款强大的数据同步和转换工具,凭借其部署易用性、容错机制、数据源支持、性能优势、功能丰富性以及活跃的社区支持,成为了数据工程师们不可或缺的利器。

因其具有的以下优良特性:在数据源方面,支持多种传统数据库、以及现有流行的多数大数据存储;数据同步方面,支持批流的数据同步方式,完美兼容离线同步、实时同步、全量同步、增量同步等实际应用场景;

其社区在技术更新上非常迅速,确保了中电信翼康能够及时获取技术支持与更新迭代。将其选型作为了数据集成主要技术。


对于我们公司基于SeaTunnel的应用实践也可以参考这篇文章:中电信翼康济世数据中台基于Apache SeaTunnel构建数据集成平台经验分享

在了解了 Apache SeaTunnel 的背景后,接下来我将分享如何快速参与其代码开发,完善功能。

以自己首次贡献代码的经历为例,简述具体步骤。

代码环境搭建

  • 首先,在 SeaTunnel 的官方 GitHub 仓库地址:https://github.com/apache/seatunnel 进行 fork 操作,将代码仓库复制到自己的 GitHub 账户中。
  • 在本地使用 IDE(如 IntelliJ IDEA)克隆 fork 后的代码,并配置 Java 以及 Maven 仓库。

  • 编译拉取的代码,并确保代码格式化:

  • 编译构建项目:
  • 对编译打包完成的 SeaTunnel 代码进行测试:
    • 解压后的代码目录:
  • 启动服务端:
  • 提交测试案例:
  • 测试成功的环境如下:

这一步非常重要,它确保你拥有一个正确的开发环境,以便后续代码开发的顺利进行。

学习与实践 SeaTunnel 的工作流程

  • 官方提供的 SeaTunnel 工作流图:

通过该图我们可以看出,SeaTunnel 的工作流程包括:source
(数据源)、transform
(数据转换)、sink
(数据目标),以及执行引擎。source
是数据的输入源,sink
是数据的输出目标,而 transform
则是将输入数据转换为目标数据的插件。SeaTunnel 支持多种执行引擎,包括其自带的 Zeta 引擎,以及 Flink 和 Spark。

  • 以 MySQL 到 MySQL 数据同步为例,以下是一个实际案例的 conf
    配置文件:

    env {
    parallelism = 1
    job.mode = "BATCH"
    }

    source {
    jdbc {
    url = "jdbc:mysql://localhost:3306/test_his"
    driver = "com.mysql.cj.jdbc.Driver"
    user = "root"
    password = "123456"
    query = "select * from ods_jc_hzjbxxb;"
    properties {
    useSSL=false
    rewriteBatchedStatements=true
    }
    }
    }

    transform {
    }

    sink {
    jdbc {
    url = "jdbc:mysql://localhost:3306/api-server"
    driver = "com.mysql.cj.jdbc.Driver"
    user = "root"
    password = "123456"
    query = """insert into ods_jc_hzjbxxb (...) values (...);"""
    properties {
    useSSL=false
    rewriteBatchedStatements=true
    }
    }
    }


该配置实现了 MySQL 到 MySQL 的简单数据同步。请根据官方文档中的 connector-v2 示例,创建 JDBC
插件,并在 plugins/jdbc/lib
目录下放置 MySQL 连接器。然后重启 SeaTunnel 服务,将配置文件放在 config
目录下,并使用以下命令提交作业:

./bin/seatunnel.cmd --config ./config/mysql_jdbc.conf

通过日志可以验证数据同步是否成功,并在目标数据库中检查同步结果。

代码阅读

通过学习 SeaTunnel 的工作流程,主要调试 SeaTunnel 自带的Zeta引擎的执行过程,通过官方文档的阅读了解到 SeaTunnel 的作业运行模式有Local和集群模式,项目实际应用更多为集群模式,因此把调试集群的执行过程作为主要学习对象。

  • 服务端执行顺序的代码调试:

通过 server.execute()
方法查看服务端的执行流程:

通过代码调试的手段了解客户端启动的执行顺序

  • 通过命令行提交完会调用org.apache.seatunnel.core.starter.seatunnel.command.ClientExecuteCommand#execute方法
  • 调用org.apache.seatunnel.engine.client.job.ClientJobProxy#submitJob方法
  • 调用服务端的org.apache.seatunnel.engine.server.CoordinatorService#submitJob

尝试开发

  • 需求背景
    我们在公司开发 OpenGauss CDC
    时,发现当前的 JDBC Sink
    插件不直接支持 OpenGauss 数据库,而是通过 PostgreSQL JDBC Sink
    来写入。

    实际使用中遇到了兼容性问题,因此我决定开发一个通过 OpenGauss 自带 JDBC 驱动进行连接的功能。

  • 代码实现
    通过阅读 JDBC 连接器的代码,我发现只需要在 seatunnel-connectors-v2/connector-jdbc
    模块下实现 OpenGauss 的 Catalog 和 Dialect。

    • org.apache.seatunnel.connectors.seatunnel.jdbc.catalog
      包下创建 OpenGauss 的 CatalogFactory
      ,因其兼容 PostgreSQL,可继承 Postgres 的实现。
    • org.apache.seatunnel.connectors.seatunnel.jdbc.internal.dialect
      包下实现 OpenGauss 的方言工厂,覆写 acceptsURL
      方法以支持 OpenGauss 的连接。
  • e2e 测试代码编写
    编写 e2e 测试需要继承 AbstractJdbcIT
    类,并实现相关的测试案例,如 initContainer
    初始化容器,以及 getJdbcCase
    配置容器信息。

最终,我通过 Git 提交代码至自己的仓库,并向 SeaTunnel 开源项目发起 Pull Request,随后关注流水线运行情况以及代码 review 的反馈,直到社区 PMC 合并代码。

不知道如何提PR的同学可以参考这篇文章:【共建开源】手把手教你贡献一个 SeaTunnel PR,超级详细教程!

个人心得

通过这次亲身参与 Apache SeaTunnel 代码贡献与学习的经历,我深入了解了 SeaTunnel 的源码与架构设计。

这不仅拓宽了我的技术视野,也让我更加深刻地理解了其分布式数据处理架构。从用户到开发者和贡献者的身份转变,使我能够更精确地将 SeaTunnel 的功能与特性应用到具体的业务场景中。

特别是在处理 source
sink
的众多配置参数时,我体会到从用户到开发者的角色转换所带来的优势。不再只是关注基本功能,而是深入理解这些配置背后的技术原理,使我能够灵活应对复杂的业务需求。

此次参与经历对我的技术成长有着重要影响,也激励我继续在开源社区中探索和贡献。

总结

通过参与 SeaTunnel 开源项目的部署、调试、阅读源码和尝试开发,我对开源项目的开发流程和规范有了更深的了解。同时,非常感谢 dailaizhangdonghao 两位大佬的知识分享与帮助!

如果你有参与开源社区的想法可以联系社区小助手:seatunnel1


同步Demo

 MySQL→Doris
MySQLCDC
MySQL→Hive
 HTTP → Doris 
HTTP → MySQL

新手入门

 SeaTunnel 让数据集成变得 So easy!  3 分钟入门指南
从 0 到 1 快速入门 Apache SeaTunnel 
初探 Apache SeaTunnel / 深入理解 Apache SeaTunnel

 MySQL 同步到 Hive / 从MySQL同步到StarRocks
通过 SeaTunnel 将数据写入 OSS-HDFS 
MySQL 到 Elasticsearch 实时同步解决方案

启动 SeaTunnel / 3 分钟部署 SeaTunnel Zeta 
 部署 Apache SeaTunnel 分布式集群
Apache SeaTunnel Web部署指南
基于Apache SeaTunnel构建CDC数据同步管道
【用户投稿】Apache SeaTunnel 2.3.3+Web 1.0.0版本安装部署
【安装部署】Apache SeaTunnel 和 Web快速安装详解
【保姆级教程】使用SeaTunnel同步Kafka的数据到ClickHouse
【数据同步】SeaTunnel初体验,5000字深入浅出带你用上Oracle-CDC

最佳实践

 OPPO 清风 天翼云 马蜂窝
孩子王 哔哩哔哩 唯品会
众安保险 兆原数通 亚信科技
映客 翼康济世 信也科技
华润置地

测试报告


 性能测试报告:SeaTunnel 批量同步数据比 GLUE 快 420%!
最新性能对比报告:SeaTunnel 是 Airbyte 30 倍!
比DataX快20%!SeaTunnel同步计算引擎性能测试全新发布
SeaTunnel 与 DataX 、Sqoop、Flume、Flink CDC 对比

源码解析


Apache SeaTunnel Zeta引擎源码解析(一) Server端的初始化
Apache SeaTunnel Zeta引擎源码解析(二) Client端的任务提交流程
Apache SeaTunnel Zeta引擎源码解析(三) Server端接收任务的执行流程
从启动到关闭 | SeaTunnel2.1.1源码解析
SeaTunnel 2.1.2 封装 Flink 连接数据库的源码解析
那些年,我们在Apache SeaTunnel 2.1.0部署中踩过的坑【含源码分析】


Apache SeaTunnel





Apache SeaTunnel 是一个分布式、高性能、易扩展、用于海量数据(离线&实时)同步和转化的数据集成平台


仓库地址: 
https://github.com/apache/seatunnel

网址:
https://seatunnel.apache.org/

Apache SeaTunnel 下载地址:
https://seatunnel.apache.org/download
衷心欢迎更多人加入!

我们相信,在「Community Over Code」(社区大于代码)、「Open and Cooperation」(开放协作)、「Meritocracy」(精英管理)、以及「多样性与共识决策」等 The Apache Way 的指引下,我们将迎来更加多元化和包容的社区生态,共建开源精神带来的技术进步!

我们诚邀各位有志于让本土开源立足全球的伙伴加入 SeaTunnel 贡献者大家庭,一起共建开源!

提交问题和建议:
https://github.com/apache/seatunnel/issues

贡献代码:
https://github.com/apache/seatunnel/pulls

订阅社区开发邮件列表 : 
dev-subscribe@seatunnel.apache.org

开发邮件列表:
dev@seatunnel.apache.org

加入 Slack:
https://join.slack.com/t/apacheseatunnel/shared_invite/zt-1kcxzyrxz-lKcF3BAyzHEmpcc4OSaCjQ

关注 Twitter: 
https://twitter.com/ASFSeaTunnel

文章转载自SeaTunnel,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论