我成为开源贡献者的原因竟然是做MySql-CDC数据同步

今年下半年机缘巧合下公司决定搭建自己的数据中台,中台的建设势必少不了数据集成。首先面临的就是数据集成技术选型的问题,按照社区活跃度、数据源适配性、同步效率等要求对市面上几个成熟度较高的开源引擎进行了深度调研。

最终经过内部讨论决定用Apache SeaTunnel作为数据集成的基础能力。

贡献经历

在了解Apache SeaTunnel之前,自己基本没有深入参与过开源项目,大多都是工作需要从而来使用。虽然内心有想尝试开源,但由于没有合适的机会,就一直没有实践。而SeaTunnel目前正处于高速迭代的阶段,这让我看到了一丝契机。

碰到问题

大概是在今年的7月份,公司在使用MySql-CDC做数据同步时遇到了一个问题,在数据同步前期任务可以正常运行,但是在运行一段时间后发现Server端日志中出现大量的GC输出,并且看到GC对内存回收效率不高。

尝试解决

因为在这之前我们的批作业是能够正确完成,所以首先排除了由于使用不当的原因。由于是内存问题,我们尝试减小JVM堆内存参数,并开启了JMX内存监控,重新运行CDC任务尝试复现问题,不出意外问题再一次出现了,根据内存监控发现CDC任务运行过程中堆内存持续增长,如下图所示:

file

到这里基本能够确定是代码导致的内存泄漏。此时就需要深入分析当前JVM的内存情况了,这里我是通过jmap将堆内存dump到本地,使用MemoryAnalyzer进行分析,具体情况如下图:

file

上图是MemoryAnalyzer中的Leak Suspects,它反映的是堆中的占比较大对象,有很大概率是这些对象导致了内存异常,从图中可以看到一个BinaryLogClient的对象无法被回收,与它关联的对象大概占用了1.7个G内存,再深入分析其关联对象,如下图:

file

可以看到在MySqlBinlogSplitReadTask中持有了这个引用,接下来再继续深入分析该对象的引用:

file

找到原因

最终发现在BinaryLogClient对象中,存在一个eventListeners的事件监听器,此时带着这个点,深入源码进行问题排查。

阅读源代码

在阅读源码的过程中,了解到eventListeners是在数据同步抽取阶段用来监听binlog的变更,将变更数据收集到一个队列中,再由后续任务处理。

MySqlBinlogSplitReadTask是用来补偿CDC快照阶段时产生的变更数据,每个MySqlBinlogSplitReadTask的执行都会向BinaryLogClient中注册一个当前的事件监听,当监听到binlog有变更时,将变更数据收集到自己分片的队列中去,且每个任务只处理当前分片范围内的binlog记录,处理完后补偿任务就会结束。但是在图3中可以看到当前仍有较多数量的Task未被释放,这与设计不符。

分析到这儿,问题的原因就浮出水面了,由于的BinaryLogClient是复用的,补偿任务在执行前会向其注册事件监听,但是未在任务结束后剔除该监听,导致后续阶段的binlog变更会因为监听未释放从而不断地写入各自分片队列且无法被消费,最终导致内存持续增长。

动手解决

根据上述分析,我调整了对应代码,在快照分片任务初始化时,手动注销上个分片注册的监听,然后进行调试,最终发现内存曲线恢复正常,如下图:

file

至此问题在本地算是解决了,但是考虑到项目性质是开源的,首先这个问题只在本地修复,以后版本更新需要再次修正,其次其他正在使用SeaTunnel的小伙伴也会遇到这样的问题。想到这里,我决定迈出自己的开源第一步,将这个问题的发现及解决提交到社区,同样也希望自己解决问题的办法能够得到社区的认可。

以下便是解决这个问题提交的PR:

file

当然这个PR并没有想象中的一帆风顺,具体原因是在修复代码时没有考虑好维护性,因此社区大佬给出了调整意见,经过后续修改最终这个PR还是被成功合并。

在这次提交PR的经历上,虽然过程有一些小插曲,但结果总算是好的,看到自己的PR能够被社区采纳,内心还是十分喜悦。正是因为这一份喜悦,让我有了更多的动力,愿意解决更多的问题。通过这次经历也想告诉大家,参与开源,贡献开源并不是想象中的那么困难,如果你不去尝试,那么你永远不会知道结果会如何。

如何参与社区

开源社区的贡献形式有很多,如代码贡献、文档贡献、发现并提交问题、问题答疑等。今天主要和大家分享一下如何在SeaTunnel中贡献自己的代码,也就是大家提到的PR(Pull Request)。

因为环境由公司到社区的转变,相对应的规范肯定也有所不同,没有统一的规范,开源将变得没有规则,那么大家提交的东西一定是乱成一团。

因此我们首先需要了解SeaTunnel提交PR的流程规范,具体大家可以搜索这篇文章:【共建开源】手把手教你贡献一个SeaTunnel PR,教程超级详细!我在这篇文章的基础上补充了几个点,防止后续小伙伴们踩坑,具体我已经标注,整个过程分为如下几个步骤: ● Fork项目 ● Clone fork项目到本地环境中 ● 基于开发分支dev创建新的分支,分支命名能够体现这次修改内容 ● 代码修改、测试

在SeaTunnel中,代码测试有几个步骤,首先是自己本地的测试,在修正完代码后,需要本地运行或是打包到服务器上测试功能是否正常。

其次是如果是新功能则需要添加对应的e2e测试用例,需要注意的是数据源以及Flink、Spark引擎相关功能的e2e都是运行在docker上,因此这类测试还需要本地安装docker环境。具体可以参考TestContainers官方。

● 代码格式检查 在前文提到的PR贡献教程文章中没有提到代码格式检查的步骤,在SeaTunnel中使用了maven插件spotless来规范我们的代码格式,首先我们需要执行mvn spotless:check命令,若在编译阶段发现有未通过格式检查的代码,则需要通过mvn spotless:apply来格式化。

这是使用spotless check检查失败的输出,我们可以看到在某个类中的某些代码未通过格式检查。

file

发现有代码未通过检查后,我们通过spotless apply来格式化代码。

file

● 提交代码,以 [Feature/Bugfix/Improve/...][Modul Name] message 的格式规范自己的Commit Message ● 创建issue,描述清楚自己遇到的问题,并提供运行环境、引擎版本、配置信息、异常日志等

注意事项:大家在提交issue的时候附上自己Server端日志会方便社区排查 ● 到GitHub中创建PR,同样PR命名也需要遵守[Feature/Bugfix/Improve/...][Modul Name] title 格式,PR需要描述解决了如何问题,以及关联对应的issue ● 等待社区成员review代码,若需要修改,则在之前提交的分支中进行调整,并重新推送 ● 等待CI检查,完成后等待审核

以上就是我如何参与SeaTunnel社区,以及贡献的经历,相信大家看了我的经历会发现开源离自己并不是那么的遥远,当然也希望有更多小伙伴能够积极参与进来!

本文由 白鲸开源科技 提供发布支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/324036.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决虚拟机字体太小的问题

在win11中,安装VMWare软件后,创建好虚拟机,打开终端后,发现终端里显示的字体太小,不方便使用,因此需要修改。 1、打开终端 2、输入"gsettings set org.gnome.desktop.interface text-scaling-factor…

运筹说 第98期|无约束极值问题

上一期我们一起学习了关于非线性规划问题的一维搜索方法的相关内容,本期小编将带大家学习非线性规划的无约束极值问题。 下面,让我们从实际问题出发,学习无约束极值问题吧! 一、问题描述及求解原理 1 无约束极值问题的定义 无约…

日志采集传输框架之 Flume,将监听端口数据发送至Kafka

1、简介 Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传 输的系统。Flume 基于流式架构,主要有以下几个部分组成。 主要组件介绍: 1)、Flume Agent 是一个 JVM 进程&#xf…

SpringBoot异常处理(Whitelabel Error Page和自定义全局异常处理页面)和整合ajax异常处理

SpringBoot异常处理(Whitelabel Error Page和自定义全局异常处理页面)和整合ajax异常处理 1、springboot自带的异常处理页面Whitelabel Error Page SpringBoot默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制。一旦程…

继钱江之后,赛科龙也出自动挡?RA401自动挡曝光

QJ在发动赛921的当天,还有一台闪300搭载了自动挡,当天的热度高的离谱,并且后续也经常有人问,这自动挡啥时候上市等等,相信有很多人都想要一台排量大一点的自动挡摩托车,而最新的消息赛科龙也在开发一台&…

文本分类的一些记录

背景 过去工作中最常遇到的问题就是文本分类和实体抽取的任务。其中文本分类是自然语言处理中最基础的任务,指的是将文本打上特定的类别标签,以做区分和筛选。文本分类主要流程一般是:先预处理文本,再提取特征,最后通…

PDF修改技巧之:如何简单方便的编辑PDF文件?

在当今精通技术的世界中,PDF 的使用已变得普遍,尤其是在商业和教育方面。如果您在审阅 PDF 文件时遇到语法或其他错误怎么办? 尽管 PDF 文件不像 Word 或在线文档那样容易编辑,但借助高级工具,您一定可以进行编辑。 …

鸿蒙 ArkUI - 常用组件和布局

目录 一、组件 1.按钮 2.单选框 3.切换按钮 4.进度条 5.文本 6.文本输入框 二、布局方式 1.线性布局 2.层叠布局 3.弹性布局 4.网格布局 一、组件 ArkUI有丰富的内置组件,包括文本、按钮、图片、进度条、输入框、单选框、多选框等。我们还可以将基础组件…

HCIA基础知识

IP地址、静态路由、动态路由、交换机 OSPF RIP DHCP VLAN ACL NAT OSI TCP/IP UDP TCP 三次握手,四次挥手,报头 什么是网络? 由网络连接设备通过传输介质将网络终端设备连接起来,进行资源共享、信息传递的平台。 OSI七…

【电子取证篇】蘇小沐的电子取证工具合集在线文档

【电子取证篇】蘇小沐的电子取证工具合集在线文档 弄成了在线表格,记得及时保存;工具永远只是辅助,但不要过多依赖自动化,有难度说明可以提升,既要不断学习也要不停思考,知行合一—【蘇小沐】 【腾讯文档…

202405读书笔记|《作家榜名著:宋词三百首(马未都亲笔推荐版)》——绿酒初尝人易醉,一枕小窗浓睡

《作家榜名著:宋词三百首(马未都亲笔推荐版)》画很美,词也是😘😘,既廖远又色彩明艳,丰富而丰盈,看的很欢乐的一本书。部分节选如下: 艳溢香融 天遥地远&…

智能搬运机器人作为一种新型的物流技术

随着物流行业的快速发展,货物转运的效率和准确性成为了企业竞争的关键因素之一。智能搬运机器人作为一种新型的物流技术,已经在许多企业中得到了广泛应用。本文将介绍富唯智能智能搬运机器人在物流行业的应用和优势。 在实际应用中,智能搬运机…

如何在Eclipse IDE中安装TestNG插件

目录 使用Eclipse Marketplace安装TestNG插件 通过输入URL安装TestNG 1.点击安装新软件 2.输入URL以安装TestNG 3.遵循正常的安装过程 4.重新启动Eclipse 在Eclipse中安装TestNG插件的视频 在这篇文章中,我们将介绍如何在Eclipse IDE中安装TestNG插件&#x…

基于算术电路的全同态加密方案介绍

基于算术电路的全同态加密方案介绍 摘 要: 云计算技术目前已经发展得相对成熟,应用也逐步得到普及,它所具有的强大的数据处理能力,能够帮助个体用户计算复杂的数据。但它带来便利的同时,也催生了一系列用户隐私数据保…

网络安全全栈培训笔记(53-WEB攻防-通用漏洞CRLF注入URL重定向资源处理拒绝服务)

第53天 WEB攻防-通用漏洞&CRLF注入&URL重定向&资源处理拒绝服务 知识点: 1、CRLF注入-原理&检测&利用 2、URL重定向-原理&检测&利用 3、Web拒绝服务-原理&检测&利用 #下节预告: 1、JSONP&CORS跨域 2、域名安全…

HCIP ISIS实验

拓扑图&IP划分如下图: 第一步,配置IP地址&环回地址 以R1为例,R2~R8同理 interface GigabitEthernet 0/0/0 ip address 18.1.1.1 24 interface GigabitEthernet 0/0/1 ip address 12.1.1.1 24 interface LoopBack 0 ip address 1.1.…

代码训练营Day.34 | 1005. K次取反后最大化的数组和、134. 加油站、135. 分发糖果

1005. K次取反后最大化的数组和 1. LeetCode链接 1005. K 次取反后最大化的数组和 - 力扣(LeetCode) 2. 题目描述 3. 解法 整体来说,就是把负数全部取反,然后如果有剩余反转次数都给绝对值最小的数。 我的解法:先…

浅谈专项测试之弱网络测试

一.弱网络测试背景 移动端产品的使用并非完全都是在流畅的wifi环境,大部分用户主要使用4G,3G,2G等网络,另外因为移动端产品使用的场景多变,如进公交,上地铁,坐电梯,使得弱网测试显得尤为重要。考…

HTML--JavaScript--引入方式

啊哈~~~基础三剑看到第三剑,JavaScript HTML用于控制网页结构 CSS用于控制网页的外观 JavaScript用于控制网页的行为 JavaScript引入方式 引入的三种方式: 外部JavaScript 内部JavaScript 元素事件JavaScript 引入外部JavaScript 一般情况下网页最好…

8个 Python 开发者必备的 PyCharm 插件

这8个顶级插件保证了更快、更轻松、更愉悦的开发过程。 在 PyCharm 插件列表中,我们发现了几个瑰宝插件,它们各自以独特的方式帮助开发者快速、简便、愉悦地开发。 今天我就给大家逐个介绍它们。 1. Key Promoter X 【下载链接】:https://…