如何参与开源贡献
参与Apache SeaTunnel开源贡献的常见方法有多种:
1)参与解答
在社区中, 帮助使用过程中遇到困难的人,帮他们解释框架的用法也算是一种贡献。
2)文档贡献
帮助框架来完善文档,比如说将英文文档翻译为中文,纠正文档里面的错误单词,这是很多人参与开源贡献的第一步。
3)代码贡献
经过阅读源码,发现源码中有Bug,修改后将代码提交给社区。或者,框架有一个新的特性亟待开发,你为新功能的实现提供了解决方案,这属于代码贡献,也是一种重要的参与开源贡献的方式。
4)参与Meetup分享
参与社区定期举行的线上/线下Meetup,以讲师或志愿者的身份参与其中,参与Apache SeaTunnel实践分享、市场、运营等活动,均属于为社区做贡献。
5)投稿
撰写关于Apache SeaTunnel的话题,无论是技术部署文档,还是实践经验、参与开源分享经验总结等,都可以投稿给社区(加小助手微信17743592110),获得发表即可视为非代码贡献。开源社区中常见的三个身份标签
1)contributor (贡献者)
只要参与过一次贡献就算是贡献者,
2)committer (提交者)
成为 contributor 后,如果你能保证持续贡献,而且有扎实的技术功底,经PMC(管理委员会)Member投票或讨论决定后,可以决定让你成为一名committer 。Committer和 contributor的区别在于,commiter对于项目的仓库是具有写的权限的。他可以审核并合并contributor的代码。而且如果成为commiter,你还会获得一个后缀为@apache.org 的邮箱。
3)PMC(管理委员会)Member
Committer中表现优秀的话,是可以成为PMC Member的。PMC Member要负责整个项目的走向,做出一些重要的决策,要具备前瞻性的技术眼光。
2
如何修改Bug
修改Bug是参与项目贡献的重要途径之一,下面举例说明如何修改Apache SeaTunnel项目中的Bug。
比如,我们发现Kafka输入插件,Kafka输出插件和Doris输出插件各有一个bug,当时kafka输入插件的bug在社区中已经有了一个解决方案。Kafka输出插件的bug,和Doris输出插件的bug是我们来做的修改,而且修改后的结果提交给了SeaTunnel社区,并且成功实现了代码合并。下面我们复现一个Doris输出插件bug的场景,并在这个基础上向大家讲解如何一步步去参与开源贡献,成为一名源码贡献者。
问题复现
1)场景
当时,向Doris插入数据时会抛出一个ClassCastException,也就是类型的强转错误。这里会报Java.Util.ArratList不能强转为java.lang.CharSequence。在反复确认我们的配置文件写的没问题后,我们仔细阅读了一下控制台打印的栈追踪信息。

2)问题定位
通过最后打印的栈追踪信息,我们可以知道出错的位置在DorisOutPutFormat.java 文件的第210行,于是我们需要去idea里面打开源码看一下这里的代码是怎么写的。
-podn.png)
3)分析问题
定位到210行后, 我们看到下面的问题。
它要将一个batch(它是一个ArrayList集合)强转为CharSequence(字符序列)。这显然是错误的。
-kskj.png)
要想解决这个问题, 我们要了解这段代码的意图。
这需要一定的背景知识,SeaTunnel的dorisSink其实是依托于doris的stream load这种导入方式来实现的。而stream load其实是通过http请求的形式,向doris导入数据。而且doris提倡提交数据的时候一定要成批地向Doris导入数据。如此一来,我们知道bacth就是用来积攒数据的一个集合,而向远端通过http发送数据必然要经过一个序列化的过程。结合上下文来看,我们可以判断这段代码的目的,就是要将 batch 里的所有数据,按照某个规则转为字符串,为 http 请求做准备。分析过程如图所示。
-uymt.png)
4)确定问题的解决方案
我们需要看一下 String 提供的这个join 静态方法,对参数的要求。
-wsnd.png)
我们发现, join 方法的第二个参数是一个 CharSequence 类型的可变长参数, 这意味着我们可以向里面传递一个 CharSequence 类型的数组。那么代码可以修改成下面这个样子。
-qnmj.png)
5)方案验证
重新打包
接着,我们可以重新编译这个包,把重新编译的包放到我们的集群上, 再跑一次任务 看看能不能通过。在这个过程中,因为跨平台性的问题(windows 和 linux 的路径不通用, 其 实也是个 bug),有一些单元测试我们无法通过,因此我们取个巧,用下面的方式进行编译打包, 跳过单元测试和代码的格式审查。
mvn clean package -D maven.test.skip=true -D checkstyle.skip=true
使用新的包
接着, 我们使用重新编译过的 SeaTunnel 执行我们之前向Doris 导入数据的命令。到我们的 Doris 上查看数据是否成功导入
这次我们的数据成功导进了 doris。而且我们的程序并没有因为类型转换错误而崩溃。
-pozt.png)
6)小结
经过上面的这些步骤,我们确信问题是出在源码的问题上。接下来我们要开始向社区汇报这个 bug,并向社区提供我们的解决方案。
3
如何创建issue
什么是 issue
Apache SeaTunnel的Github仓库下有一个项目独立的 issue 板块。在这个板块里面,大家可以提出自己的问题,也可以去和大家讨论 SeaTunnel 是否要添加一些特性。而且,这是一个可以汇报 bug 的地方。
-lhbp.png)
开源社区通常会要求你在提交代码合并的请求前,先去创建一个 issue。这是一个好的 习惯,就像是我们抓贼要先立案,逮捕要先有逮捕令。创建 pull request 之前先创建 issue , 然后把 pr 关联到我们创建的 issue 上, 让每一次改动,都有据可查。
如何创建 issue
1)点击 new issue 按钮进入下一个页面
-qdko.png)
2)选择你要创建的 issue 类型,我们选择 bug report(bug 汇报),进入下一个页面
-iwfp.png)
3)按照表单的提示,一步步填写完整。注意,表单提醒你,创建 issue 之前应该先去搜索社区中是否已经有讨论同一问题的 issue 。同样的问题,无需重复。
-trsf.png)
4)按照要求填写表单后,点击下方的 Submit new issue。创建这个 issue。
-skvk.png)
5)查看我们已经创建好的 issue
-kdwy.png)
4
如何创建Pull Request
pull request 的意思是拉取请求, 也就是我这有代码写好了,请你把我的代码拉过去吧。所以, 发起拉取请求之前应该要先有自己的代码。这样一来, 创建 pull request 并不是一上 来就创建, 而是要先搞好自己的代码仓库。
pull request 的简称是 pr。
5.4.1 fork 项目到自己的仓库中。
对于第一次为 SeaTunnel 做贡献的同学来说,应该先 fork (叉子) 官方的仓库。
-hjbo.png)
点击 fork 按钮后,你自己的 github 账号上会出现一个一模一样的仓库。如下图所示。
-rijd.png)
git clone 自己 fork 的仓库
-phpl.png)
拿到这个 url,在自己电脑上的任意目录上使用下面的 git 命令去clone 这个仓库。
5
如何修改代码
1)在项目的跟目录右键,用 idea 打开我们 clone 的项目
2)在我们之前确定的位置,改代码
-mlla.png)
3)commit 提交
(这个地方应该先建一个分支,从 dev 上分出来,在新建分支的基础上 commit。这里成反面教材了_)
-drng.png)
4)push 到我们fork 的仓库里去,这个时候在远端的目标分支上, 我们写一个新的分支名
-cdej.png)
6
如何创建PR
1)去我们的 github 上, 看一下自己的仓库,发现它会提示我们可以创建一个pr 了。点击这个按钮,进入下一个页面
.png)
2)在新的页面中,按照对话框里给出的模板,说明我们这个 pr 的目的。最终,不要忘了 和你之前的 issue 关联起来,关联的方式就是直接粘贴你创建的issue 的链接。
.png)
3)全部搞定之后, 点击 create pull request 按钮,创建一个pr
.png)
4)我们还可以看到 github 会判断我们做了哪些修改。红色的地方表示我们删除的代码, 绿 色的地方表示我们新增的代码。因为 github 的差异是按行进行标记的。所以如果你就改了 一个字母。也是一个删除行和新增行的效果。
5)我们的PR 已经提交完毕,我们可以看到github会启动一个自动的检查。这个叫做CI/CD。持续交付/持续部署的意思。简单来说,你上传的代码,云端会自动拉取,然后自动地跑一边编译,然后进行单元测试,代码格式等一系列检查。这些测试都通过后,你的代码才有被合并的可能。
6)接下来你可以去干点别的,自动测试的时间会比较久,而且你需要等待社区人员注意到你的Pull Request。
7
成功成为源码贡献者!
过一段时间就可以回来看一下你的 pr 了。我们看到有一个 apache member 审核了我们 的代码,并将我们的代码合并到了项目中。以后,大家使用 seatunnel 将数据从 flink 写入 doris,就有你的一份功劳了。
.png)
你的发言记录上,会出现 contributor 的标记。
.png)
弄完这些, 就算是 SeaTunnel 的源码贡献者啦。
8
寻找贡献机会
Apache 的开源项目中, 社区成员们通常会维护一个待办列表,里面是一些好做的任务,适合新手上路。
.png)