如何参与开源贡献—SeaTunnel为例 文1

如何参与开源贡献—SeaTunnel为例 文1

5.1 基本概念

5.1.1 参与开源贡献的常见方法

1)参与解答

在社区中,帮助使用过程中遇到困难的人,帮他们解释框架的用法也算是一种贡献。

2)文档贡献

帮助框架来完善文档,比如说将英文文档翻译为中文,纠正文档里面的错误单词,这是很多人参与开源贡献的第一步。

3)代码贡献

经过阅读源码,发现源码中有Bug,修改后将代码提交给社区。或者,框架有一个新的特性亟待开发,你为新功能的实现提供了解决方案,这属于代码贡献,也是一种重要的参与开源贡献的方式。

5.1.2 开源社区中常见的三个身份标签

1)contributor(贡献者)

只要参与过一次贡献就算是贡献者,

2)committer(提交者)

成为contributor后,如果你能保证持续贡献,而且有扎实的技术功底,经PMC(管理委员会)投票或讨论决定后,可以决定让你成为一名committer。Committer和contributor的区别在于,commiter对于项目的仓库是具有写的权限的。他可以审核并合并contributor的代码。而且如果成为commiter,你还会获得一个后缀为@apache.org的邮箱。

3)PMC(管理委员会)

Committer中表现优秀的话,是可以成为PMC的。PMC要负责整个项目的走向,做出一些重要的决策,要具备前瞻性的技术眼光。

5.2 如何修改bug

5.2.1 背景

在我们准备这项课程的时候,实际上kafka输入插件,kafka输出插件和doris输出插件是各有一个bug的,当时kafka输入插件的bug在社区中已经有了一个解决方案。Kafka输出插件的bug,和doris输出插件的bug是我们来做的修改,而且修改后的结果提交给了SeaTunnel社区,并且成功实现了代码合并。下面我们复现一个doris输出插件bug的场景,并且在这个基础上向大家讲解如何一步步去参与开源贡献,成为一名源码贡献者。

5.2.2 问题复现

1)场景

当时,向doris插入数据时会抛出一个ClassCastException,也就是类型的强转错误。这里会报Java.Util.ArratList不能强转为java.lang.CharSequence。在反复确认我们的配置文件写的没问题后。我们仔细阅读了一下控制台打印的栈追踪信息。

2)问题定位

通过最后打印的栈追踪信息,我们可以知道出错的位置在DorisOutPutFormat.java文件的第210行,于是我们需要去idea里面打开源码看一下这里的代码是怎么写的。

5.2.3 分析问题

定位到210行后,我们看到下面的问题。

它要将一个batch(它是一个ArrayList集合)强转为CharSequence(字符序列)。这显然是错误的。

要想解决这个问题,我们要了解这段代码的意图。

这需要一定的背景知识,SeaTunnel的dorisSink其实是依托于doris的stream load这种导入方式来实现的。而stream load其实是通过http请求的形式,向doris导入数据。而且doris提倡提交数据的时候一定要成批地向doris导入数据。如此一来,我们知道bacth就是用来积攒数据的一个集合,而向远端通过http发送数据必然要经过一个序列化的过程。结合上下文来看,我们可以判断这段代码的目的,就是要将batch里的所有数据,按照某个规则转为字符串,为http请求做准备。分析过程如图所示。

5.2.4 确定问题的解决方案

我们需要看一下String提供的这个join静态方法,对参数的要求。

我们发现,join方法的第二个参数是一个CharSequence类型的可变长参数,这意味着我们可以向里面传递一个CharSequence类型的数组。那么代码可以修改成下面这个样子。

屏幕的截图

描述已自动生成

5.2.5 方案验证

1)重新打包

接着,我们可以重新编译这个包,把重新编译的包放到我们的集群上,再跑一次任务看看能不能通过。在这个过程中,因为跨平台性的问题(windows和linux的路径不通用,其实也是个bug),有一些单元测试我们无法通过,因此我们取个巧,用下面的方式进行编译打包,跳过单元测试和代码的格式审查。

mvn clean package -D maven.test.skip=true -D checkstyle.skip=true

2)使用新的包

接着,我们使用重新编译过的SeaTunnel执行我们之前向Doris导入数据的命令。

bin/start-seatunnel-flink.sh --config config/example04.conf

3)到我们的Doris上查看数据是否成功导入

这次我们的数据成功导进了doris。而且我们的程序并没有因为类型转换错误而崩溃。

电脑屏幕截图

描述已自动生成

4)小结

经过上面的这些步骤,我们确信问题是出在源码的问题上。接下来我们要开始向社区汇报这个bug,并向社区提供我们的解决方案。

posted @ 2022-12-09 00:23  LEEPINE  阅读(605)  评论(0)    收藏  举报