成为 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 包

项目根路径下执行(注意 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

个人建议首先通过插件格式化一下代码(这也是 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 是下一代高性能、分布式、海量数据集成平台,已经在 B 站、腾讯云等 100 家公司生产使用。目前处于 incubator 阶段。作为公司内部使用的 ETL 工具,Seatunnel 可以基于已有的 Spark、Flink 计算平台进行数据交换也可以运行在 k8s 平台上…...

MySQL的索引视图练习题
学生表:Student (Sno, Sname, Ssex , Sage, Sdept) 学号,姓名,性别,年龄,所在系 Sno为主键 课程表:Course (Cno, Cname,) 课程号,课程名 Cno为主键 学生选课表:SC (Sno, Cno, Score)…...
【C++ Primer Plus】第四章:复合类型
文章目录4.1 数组C11数组初始化的方法4.2 字符串**cin是如何确定已完成字符串输入呢?****如何每次读取一行字符串输入?****面向行的输入:getline()****面向行的输入:get( )****为什么推荐使用get( ),而不是getline( )呢…...

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

日本机载激光雷达测深进展(一)日本启动测量90%沿岸水深项目
海洋地图项目利用航空测深绘制日本90%沿海20m以浅区域,是日本海道协会(JHA)和日本财团的一个联合项目。 迄今为止,只有不到2%的日本沿海水域得到了测绘,严重拖累了在海洋事故、防灾减灾、篮碳以及生物多样性保护等领域…...

MySQL数据库调优————创建索引的原则和索引失效及解决方案
创建索引的原则 建议创建索引的场景 select语句,频繁作为where条件的字段update/delete语句的where条件需要分组、排序的字段distinct所使用的字段字段的值有唯一性约束对于多表查询,联接字段应创建索引,且类型无比保持一致 避免隐式转换 …...

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

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

深度学习算法面试常问问题(二)
X86和ARM架构在深度学习侧的区别? X86和ARM架构分别应用于PC端和低功耗嵌入式设备,X86指令集很复杂,一条很长的指令就可以完成很多功能;而ARM指令集很精简,需要几条精简的短指令完成很多功能。 影响模型推理速度的因…...

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

恭喜! SelectDB 五位开发者成为 Apache Doris 新晋 PMC 成员和 Committer!
近期,通过 Apache Doris 项目管理委员会的推荐与投票,Apache Doris 社区正式迎来了 2 位新晋 PMC 成员 和 8 位新晋 Committer 的加入。值得关注的是,2 位新晋 PMC 成员均来自 SelectDB,分别是衣国垒(yiguolei…...

数据库面试题
第一范式(1NF) 第一范式是指数据库的每一列都是不可分割的基本数据项,而下面这样的就存在可分割的情况: 学生(姓名,电话号码) 电话号码实际上包括了家用座机电话和移动电话,因此它…...
[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(1≤N≤105)头奶牛,…...

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

【JavaWeb】传输层协议——UDP + TCP
目录 UDP协议 UDP协议结构 UDP的特点 TCP协议 TCP协议结构 TCP的特点 TCP的十个核心机制 确认应答 超时重传 连接管理 滑动窗口 流量控制 阻塞控制 延迟应答 捎带应答 粘包问题 异常处理 UDP协议 UDP协议结构 源端口:存储的是发送方的端口号。 目的…...
C++ 中是用来修饰:内置类型变量、自定义对象、成员函数、返回值、函数参数
const 是 constant 的缩写,本意是不变的,不易改变的意思。在 C 中是用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数。 一. const修饰 普通类型的变量 const int a 7; int b a; // 正确 …...
av 146 002
61. 一个新的敏捷项目经理正试图确定团队该如何执行一个发布计划的进度。哪种工具可以更深入地了解团队的进展? A. 发布计划系统 B. 产品路线图。 C. 看板。 D. 燃尽图 62. 你的项目发起人找到你,让你知道他正在考虑给你项目中的一位高级工程师颁发1000美元的现…...

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

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

Linux内存分区(swap)
目录 1、使用物理分区创建内存交换分区 2、使用文件创建内存交换文件 当硬件的设备资源充足的话,那么swap是不会被我们的系统所使用到的,所以swap会被利用到的时刻通常就是物理内存不足的情况 我们知道CPU所读取的数据都来自于内存,那么当…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...