当前位置: 首页 > news >正文

成为 Seatunnel 源码贡献者保姆级教程

Apache SeaTunnel 是下一代高性能、分布式、海量数据集成平台,已经在 B 站、腾讯云等 100+ 家公司生产使用。目前处于 incubator 阶段。作为公司内部使用的 ETL 工具,Seatunnel 可以基于已有的 Spark、Flink 计算平台进行数据交换也可以运行在 k8s 平台上,作为公司大数据团队小小小组长在调研了海量的开源项目(其实就一两个)最终选用 Seatunnel 作为公司的 ETL 工具的底层。而在前期测试过程中发现 Seatunnel 依然存在一些 bug,而本人也在结合公司数据迁移业务发现了若干 bug 并提交代码进行解决同时结合业务场景提交了一个 feature,如果你也想成为它的 contributors 那你就需要认真阅读这篇文章了。下面将从零开始教你成为 Seatunnel 源码贡献者。

一、写在前面

首先你必须要有使用 Seatunnel 的需求,如果只是学习、测试已经很难发现 bug,因为 Seatunnel 从 2017 年开始,经过近五年的发展一些浅显的 bug 早就不复存在,加上 Seatunnel 严格的 e2e 通过对产品的简单使用很难发现问题(一些冷门的连接器除外)。

二、如何编译

官方文档已经给出了源码编译的过程,但随着项目的开发和我实际编译过程中出现的问题,对文档做出补充。下面是我在三端(mac、windows、linux)编译过程中出现的问题的总结以及解决方案

spotless插件下载失败[403]

根据报错信息,发现是 javac-shaded-9+181-r4173-1.jar(当你看到这里的时候可能已经不是这个版本了)下载失败 403 错误,解决方案:

maven 中心仓库中手动下载 jar 包

image-20230216150006918

项目根路径下执行(注意 jar 包路径的替换)

mvn install:install-file -DgroupId=com.google.errorprone -DartifactId=javac-shaded -Dversion=9+181-r4173-1 -Dpackaging=jar -Dfile=/root/Project/lib/javac-shaded-9+181-r4173-1.jar

jindo 系列包不存在

这类问题主要是阿里云 oss 连接器的问题,jindo 的介绍可以看这里 下载地址 。他的 jar 目前没有上传至 maven 各大仓库(阿里云自己的maven也没有),因此需要离线下载 下载地址,解压之后我们需要给 Seatunnel 安装下面两个 jar,都在下载的 tar 的 lib 目录下

mvn install:install-file -DgroupId=com.aliyun.jindodata -DartifactId=jindo-core -Dversion=4.6.1 -Dpackaging=jar -Dfile=/Users/wjun/Documents/Program/lib/jindosdk-4.6.1/lib/jindo-core-4.6.1.jarmvn install:install-file -DgroupId=com.aliyun.jindodata -DartifactId=jindosdk -Dversion=4.6.1 -Dpackaging=jar -Dfile=/Users/wjun/Documents/Program/lib/jindosdk-4.6.1/lib/jindo-sdk-4.6.1.jar

这样基本上都可以编译通过,例如:

编译整个项目

mvn clean package -pl seatunnel-dist -am -Dmaven.test.skip=true

编译某个模块

mvn clean package -pl seatunnel-connectors-v2/connector-redis -am -DskipTests -T 1C

三、如何运行&调试

官方文档已经给出了本地运行的方式,但如果你运行其他连接器时就会出现

Caused by: java.lang.RuntimeException: Plugin PluginIdentifier{engineType='seatunnel', pluginType='source', pluginName='Elasticsearch'} not found.at org.apache.seatunnel.plugin.discovery.AbstractPluginDiscovery.createPluginInstance(AbstractPluginDiscovery.java:219)at org.apache.seatunnel.engine.core.parse.ConnectorInstanceLoader.loadSourceInstance(ConnectorInstanceLoader.java:63)at org.apache.seatunnel.engine.core.parse.JobConfigParser.sampleAnalyze(JobConfigParser.java:352)at org.apache.seatunnel.engine.core.parse.JobConfigParser.parse(JobConfigParser.java:133)at org.apache.seatunnel.engine.client.job.JobExecutionEnvironment.getLogicalDag(JobExecutionEnvironment.java:155)at org.apache.seatunnel.engine.client.job.JobExecutionEnvironment.execute(JobExecutionEnvironment.java:147)at org.apache.seatunnel.core.starter.seatunnel.command.ClientExecuteCommand.execute(ClientExecuteCommand.java:122)... 2 more

例如我在调试 Elasticsearch 插件时就出现这个问题,很显然运行时的相关 jar 没有被加载,只需要在 seatunnel-engine-examples 模块的 pom 文件添加上对应插件模块的依赖即可,例如调试 es

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.apache.seatunnel</groupId><artifactId>seatunnel-examples</artifactId><version>${revision}</version></parent><artifactId>seatunnel-engine-examples</artifactId><dependencies><dependency><groupId>org.apache.seatunnel</groupId><artifactId>seatunnel-starter</artifactId><version>${project.version}</version></dependency><!--   seatunnel-transforms-v2   --><dependency><groupId>org.apache.seatunnel</groupId><artifactId>seatunnel-transforms-v2</artifactId><version>${project.version}</version></dependency><!--   seatunnel-transforms-v2   --><dependency><groupId>org.apache.seatunnel</groupId><artifactId>connector-console</artifactId><version>${project.version}</version></dependency><dependency><groupId>org.apache.seatunnel</groupId><artifactId>connector-elasticsearch</artifactId><version>${project.version}</version><exclusions><exclusion><groupId>com.google.guava</groupId><artifactId>guava</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.1-jre</version></dependency></dependencies>
</project>

这里排除 guava 只是针对 Elasticsearch,之前的作者在开发 Elasticsearch 支持 https 协议时使用的 airlift 依赖的 guava 与 Seatunnel 统一定义的 guava 版本冲突了(这个问题已经被我顺带解决了pr#4076) ,这时候就可以在 IDE 上随意打断点了。

四、如何PR

当你在使用过程中出现了 bug 首先你应该去 github 上搜索或提出 issue,因为你所使用的 release 版本这个 bug 可能已经被发现和解决,这时候你只需要拉取最新的 dev 分支代码后重新编译出现 bug 的模块后替换 jar 包即可。如果在 issue 或 pr 上没有发现这个 bug,那么需要你贡献力量的时候到了。

首先你需要 fork 源代码到你的私有仓库 -> clone 私有仓库到本地 -> 创建bug分支并修改代码 —> 本地运行测试

如果你为 Seatunnel 添加了 feature 你还需要为其编写 e2e 和补齐 docs

当一切没有问题时不要着急提交你的代码,你可能需要走一遍 CI,当然这个 CI 你可以推到远程仓库交由 github 执行,如果你不想 review 的成员看到你因为通过 CI 而疯狂 commit 最好在本地跑一遍 CI

image-20230216153128807

个人建议首先通过插件格式化一下代码(这也是 CI 的一部分,即使你只是修改了一下文档),命令如下

mvn spotless:apply

如果修改过 e2e 则也需要走一遍 CI(最好跑一遍,我的多次提交就是因为过分相信自己让 github 跑 CI),注意:e2e 的 CI 需要本地有 Docker 环境,命令如下

mvn -T 1C -B verify -DskipUT=true -DskipIT=false -D"license.skipAddThirdParty"=true --no-snapshot-updates -pl :connector-elasticsearch-e2e -am -Pci

经过三端测试,相同配置在 linux 上跑 e2e 的 CI 最快,可能是因为 Docker 在 windows、mac 独特的运行模式吧

当 CI 本地没有问题时就可以提交代码并创建 PR 了,此时你需要按照规范编写一段详细的 commented 并关注绑定 github 的邮箱邮件即可。Seatunnel 社区成员还是很活跃很大一部分都是国人,但在沟通时最好还是使用英文(机翻即可,啊哈哈哈!!!)

相关文章:

成为 Seatunnel 源码贡献者保姆级教程

Apache SeaTunnel 是下一代高性能、分布式、海量数据集成平台&#xff0c;已经在 B 站、腾讯云等 100 家公司生产使用。目前处于 incubator 阶段。作为公司内部使用的 ETL 工具&#xff0c;Seatunnel 可以基于已有的 Spark、Flink 计算平台进行数据交换也可以运行在 k8s 平台上…...

MySQL的索引视图练习题

学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;SC (Sno, Cno, Score)…...

【C++ Primer Plus】第四章:复合类型

文章目录4.1 数组C11数组初始化的方法4.2 字符串**cin是如何确定已完成字符串输入呢&#xff1f;****如何每次读取一行字符串输入&#xff1f;****面向行的输入&#xff1a;getline()****面向行的输入&#xff1a;get( )****为什么推荐使用get( )&#xff0c;而不是getline( )呢…...

做外贸,你不能不懂的外贸流程知识

报关是履行海关进出境手续的必要环节之一&#xff0c;涉及两大类:进出境运输工具、物品和货物。由于性质不同&#xff0c;报关手续也有些不同。今天我就为大家详细介绍一下进出口报关的流程&#xff0c;包括出口货物报关的流程&#xff0c;随报关单提交的运费和商业单据&#x…...

日本机载激光雷达测深进展(一)日本启动测量90%沿岸水深项目

海洋地图项目利用航空测深绘制日本90%沿海20m以浅区域&#xff0c;是日本海道协会&#xff08;JHA&#xff09;和日本财团的一个联合项目。 迄今为止&#xff0c;只有不到2%的日本沿海水域得到了测绘&#xff0c;严重拖累了在海洋事故、防灾减灾、篮碳以及生物多样性保护等领域…...

MySQL数据库调优————创建索引的原则和索引失效及解决方案

创建索引的原则 建议创建索引的场景 select语句&#xff0c;频繁作为where条件的字段update/delete语句的where条件需要分组、排序的字段distinct所使用的字段字段的值有唯一性约束对于多表查询&#xff0c;联接字段应创建索引&#xff0c;且类型无比保持一致 避免隐式转换 …...

设计师都在看的全球设计网站,你居然还不知道!

设计师需要拥有无限的创意和熟练的技巧&#xff0c;并且对行业的前景和客户的心理有一定的了解。要能达到“陌生化”之前&#xff0c;肯定是有知识储备&#xff0c;专业能力的前提要求&#xff0c;以及创新能力。 今天为大家整理了多个优秀全球设计网站&#xff0c;这些博客内…...

c++:缺省参数,函数重载

今天介绍的是cpp中的缺省参数以及函数重载的知识。 首先我们先看看缺省参数&#xff1a; 缺省参数 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实 参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 例如&#…...

深度学习算法面试常问问题(二)

X86和ARM架构在深度学习侧的区别&#xff1f; X86和ARM架构分别应用于PC端和低功耗嵌入式设备&#xff0c;X86指令集很复杂&#xff0c;一条很长的指令就可以完成很多功能&#xff1b;而ARM指令集很精简&#xff0c;需要几条精简的短指令完成很多功能。 影响模型推理速度的因…...

美国CPC认证是什么?儿童玩具亚马逊CPC认证审核有哪些问题?

很多卖家都有遭遇listing下架&#xff0c;被要求提供CPC认证报告。这是因为亚马逊有时会加强对儿童产品的审查。本文带大家对CPC认证进行一个全面了解。什么是CPC认证&#xff1f;CPC认证&#xff0c;全称ChildrensProductCertification.是认可实验室&#xff0c;根据产品不同适…...

恭喜! SelectDB 五位开发者成为 Apache Doris 新晋 PMC 成员和 Committer!

近期&#xff0c;通过 Apache Doris 项目管理委员会的推荐与投票&#xff0c;Apache Doris 社区正式迎来了 2 位新晋 PMC 成员 和 8 位新晋 Committer 的加入。值得关注的是&#xff0c;2 位新晋 PMC 成员均来自 SelectDB&#xff0c;分别是衣国垒&#xff08;yiguolei&#xf…...

数据库面试题

第一范式&#xff08;1NF&#xff09; 第一范式是指数据库的每一列都是不可分割的基本数据项&#xff0c;而下面这样的就存在可分割的情况&#xff1a; 学生&#xff08;姓名&#xff0c;电话号码&#xff09; 电话号码实际上包括了家用座机电话和移动电话&#xff0c;因此它…...

[USACO2022-DEC-Bronze] T2 Feeding the Cows 题解

一、题目描述Farmer John has N (1≤N≤10^5) cows, the breed of each being either a Guernsey or a Holstein. They have lined up horizontally with the cows occupying positions labeled from 1…N.Farmer John 有 N&#xff08;1≤N≤105&#xff09;头奶牛&#xff0c…...

Unity法线贴图原理理解(为什么存在切线空间?存的值是什么?)

Unity法线贴图原理理解(为什么存在切线空间&#xff1f;存的值是什么&#xff1f;&#xff09;写在前面1、为什么用法线贴图&#xff1f;2、用什么存法线&#xff1f;3、法线向量为什么存在切线空间&#xff1f;法线贴图存得是什么&#xff1f;4、法线贴图为什么会偏蓝&#xf…...

【JavaWeb】传输层协议——UDP + TCP

目录 UDP协议 UDP协议结构 UDP的特点 TCP协议 TCP协议结构 TCP的特点 TCP的十个核心机制 确认应答 超时重传 连接管理 滑动窗口 流量控制 阻塞控制 延迟应答 捎带应答 粘包问题 异常处理 UDP协议 UDP协议结构 源端口&#xff1a;存储的是发送方的端口号。 目的…...

C++ 中是用来修饰:内置类型变量、自定义对象、成员函数、返回值、函数参数

const 是 constant 的缩写&#xff0c;本意是不变的&#xff0c;不易改变的意思。在 C 中是用来修饰内置类型变量&#xff0c;自定义对象&#xff0c;成员函数&#xff0c;返回值&#xff0c;函数参数。 一. const修饰 普通类型的变量 const int a 7; int b a; // 正确 …...

av 146 002

61. 一个新的敏捷项目经理正试图确定团队该如何执行一个发布计划的进度。哪种工具可以更深入地了解团队的进展? A. 发布计划系统 B. 产品路线图。 C. 看板。 D. 燃尽图 62. 你的项目发起人找到你&#xff0c;让你知道他正在考虑给你项目中的一位高级工程师颁发1000美元的现…...

小红书用户画像 | 小红书数据平台

小红书的用户画像是小红书品牌营销的必备技能&#xff0c;也是小红书推广种草的一个重要前提。通过对小红书用户画像进行分析&#xff0c;对品牌进行精准营销&#xff0c;实现更高的流量转化。 2022小红书粉丝人群画像 千瓜数据在2022年发布的千瓜活跃用户画像趋势报告中分析了…...

【STM32笔记】低功耗模式下GPIO、外设、时钟省电配置避坑

【STM32笔记】低功耗模式下GPIO、外设、时钟省电配置避坑 前文&#xff1a; blog.csdn.net/weixin_53403301/article/details/128216064 【STM32笔记】HAL库低功耗模式配置&#xff08;ADC唤醒无法使用、低功耗模式无法烧录解决方案&#xff09; blog.csdn.net/weixin_534033…...

Linux内存分区(swap)

目录 1、使用物理分区创建内存交换分区 2、使用文件创建内存交换文件 当硬件的设备资源充足的话&#xff0c;那么swap是不会被我们的系统所使用到的&#xff0c;所以swap会被利用到的时刻通常就是物理内存不足的情况 我们知道CPU所读取的数据都来自于内存&#xff0c;那么当…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...

window 显示驱动开发-如何查询视频处理功能(三)

​D3DDDICAPS_GETPROCAMPRANGE请求类型 UMD 返回指向 DXVADDI_VALUERANGE 结构的指针&#xff0c;该结构包含特定视频流上特定 ProcAmp 控件属性允许的值范围。 Direct3D 运行时在D3DDDIARG_GETCAPS的 pInfo 成员指向的变量中为特定视频流的 ProcAmp 控件属性指定DXVADDI_QUER…...

Python爬虫(四):PyQuery 框架

PyQuery 框架详解与对比 BeautifulSoup 第一部分&#xff1a;PyQuery 框架介绍 1. PyQuery 是什么&#xff1f; PyQuery 是一个 Python 的 HTML/XML 解析库&#xff0c;它采用了 jQuery 的语法风格&#xff0c;让开发者能够用类似前端 jQuery 的方式处理文档解析。它的核心特…...

Spring Boot 与 Kafka 的深度集成实践(二)

3. 生产者实现 3.1 生产者配置 在 Spring Boot 项目中&#xff0c;配置 Kafka 生产者主要是配置生产者工厂&#xff08;ProducerFactory&#xff09;和 KafkaTemplate 。生产者工厂负责创建 Kafka 生产者实例&#xff0c;而 KafkaTemplate 则是用于发送消息的核心组件&#x…...