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

news2024/9/29 11:35:56

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

最终经过内部讨论决定用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社区,以及贡献的经历,相信大家看了我的经历会发现开源离自己并不是那么的遥远,当然也希望有更多小伙伴能够积极参与进来!

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能安全帽识别系统简析

在工业安全领域,安全帽识别系统的重要性不言而喻。这种系统利用先进的图像识别技术,确保工地上每位工人都佩戴安全帽,从而大幅提升工作场所的安全性。本文旨在探讨这一系统的工作原理、应用范围以及面临的挑战。 安全帽识别系统的工作原理 智…

查找算法(部分)

顺序查找 顺序查找是最简单的了&#xff0c;属于无序查找算法&#xff0c;它的原理就是从前往后一个一个的找&#xff0c;如果找到了就返回它的位置&#xff0c;否则就返回-1。 如果有多个相同元素的话&#xff0c;返回第一个该元素的位置。 代码&#xff1a; #include<…

高通开发系列 - RT补丁死机问题scheduling while atomic

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 返回:专栏总目录 目录 背景概述问题现象了解RTOS如何使用高分辨率计时器?RT-mutex 实现设计线程化的中断处理程序睡眠spinlock

图解python | 字符串及操作

1.Python元组 Python的元组与列表类似&#xff0c;不同之处在于元组的元素不能修改。 元组使用小括号&#xff0c;列表使用方括号。 元组创建很简单&#xff0c;只需要在括号中添加元素&#xff0c;并使用逗号隔开即可。 tup1 (ByteDance, ShowMeAI, 1997, 2022) tup2 (1…

通过FTP和HTTPD,搭建内网yum仓库

一、yum仓库的简介 1.yum介绍 yum是一个基于RPM包&#xff08;是Red-Hat Package Manager红帽软件包管理器的缩写&#xff09;构建的软件更新机制&#xff0c;能够自动解决软件包之间的依赖关系。解决了日常工作中的大量查找安装依赖包的时间 为什么会有依赖关系的发生 因为li…

GPT图解大模型是怎样构建的

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…

网络文件共享服务

目录 一.存储类型&#xff1a; 1.存储类型分为三种&#xff1a; 2.NAS的概述&#xff1a; 3.SAN的概述&#xff1a; 4.DAS的概述&#xff1a; 二.FTP 文件传输协议&#xff1a; 1.FTP工作原理&#xff1a; 2.FTP的两种模式&#xff1a; 3.FTP的用户认证&#xff1a; 三…

Ncast盈可视高清智能录播系统busiFacade RCE漏洞(CVE-2024-0305)

产品介绍 Ncast盈可视高清智能录播系统是一套新进的音视频录制和播放系统&#xff0c;旨在提供高质量&#xff0c;高清定制的录播功能。 漏洞描述 广州盈可视电子科技有限公司的高清智能录播系统存在信息泄露漏洞(CVE-2024-0305)&#xff0c;攻击者可通过该漏洞&#xff0c;…

【HarmonyOS4.0】第十篇-ArkUI布局容器组件(二)

三、层叠布局容器&#xff08;Stack&#xff09; 堆叠容器组件 Stack的布局方式是把子组件按照设置的对齐方式顺序依次堆叠&#xff0c;后一个子组件覆盖在前一个子组件上边。 注意&#xff1a;Stack 组件层叠式布局&#xff0c;尺寸较小的布局会有被遮挡的风险&#xff0c; …

【PyQt小知识 - 7】:QLineEdit设置输入的文本以圆点或星号等方式显示

文章目录 setEchoMode setEchoMode 在PyQt中&#xff0c;QLineEdit是一种用于接收用户输入的小部件&#xff08;widget&#xff09;。setEchoMode是QLineEdit类中的一个方法&#xff0c;可以用于设置文本输入框中的文本显示模式。它接受一个参数来指定要使用的模式。 setEcho…

springIoc依赖注入循环依赖三级缓存

springIoc的理解&#xff0c;原理和实现 控制反转&#xff1a; 理论思想&#xff0c;原来的对象是由使用者来进行控制&#xff0c;有了spring之后&#xff0c;可以把整个对象交给spring来帮我们进行管理 依赖注入DI&#xff1a; 依赖注入&#xff0c;把对应的属性的值注入到…

一文读懂「生成式AI,AIGC」

一、什么是AIGC&#xff1f; 二、技术层面发展 AIGC要素&#xff1a;算力 算法 数据 AIGC发展重点 AIGC产业链路 AIGC未来方向 三、产业层面发展 AIGC产业融资 AIGC场景应用 四、AIGC应用分析 AI 游戏 eg&#xff1a;网易伏羲 AI 广告营销 eg&#xff1a; AI 影…

vue使用i18n实现国际化

安装 npm install vue-i18nnext在src下创建一个名为i18n的文件夹,并按照下图创建需要的文件 i18n/locales/en.json {"common": {"BUTTON_OK": "OK","BUTTON_CANCEL": "Cancel","BUTTON_SUBMIT": "Submit…

虾皮广告数据分析:如何在虾皮(Shopee)平台上进行广告推广

在虾皮&#xff08;Shopee&#xff09;平台上进行广告推广是提高产品曝光率和销量的有效方式。通过采取一系列步骤&#xff0c;卖家可以充分利用Shopee的广告功能来推广产品。本文将介绍如何在Shopee上进行广告推广&#xff0c;并提供一些实用的技巧和建议。了解广告类型首先&a…

数据库——DAY4(练习-在表中查找数据-多表查询)

一、实验要求&#xff08;多表查询&#xff09; 素材&#xff1a; 1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); …

Tessy—嵌入式软件单元测试/集成测试工具

产品概述 Tessy源自戴姆勒—奔驰公司的软件技术实验室&#xff0c;由德国Hitex公司负责销售及技术的支持服务&#xff0c;是一款专门针对嵌入式软件进行单元/集成测试的工具。它可以对C/C代码进行单元、集成测试&#xff0c;可以自动化搭建测试环境、执行测试、评估测试结果并生…

yarn包管理器在添加、更新、删除模块时,在项目中是如何体现的

技术很久不用&#xff0c;就变得生疏起来。对npm深受其害&#xff0c;决定对yarn再整理一遍。 yarn包管理器 介绍安装yarn帮助信息最常用命令 介绍 yarn官网&#xff1a;https://yarn.bootcss.com&#xff0c;学任何技术的最新知识&#xff0c;都可以通过其对应的网站了解。无…

el-tree定义左边箭头,包括下级出现连线

效果图&#xff1a; 代码&#xff1a; <template><div class"agency-wrap"><el-treeclass"filter-tree":data"detailList":props"defaultProps"default-expand-allnode-click"onClickNode":filter-node-me…

基于springboot+vue的网上花卉商城系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

2、BERT:自然语言处理的变革者

请参考之前写的&#xff1a;2、什么是BERT&#xff1f;-CSDN博客文章浏览阅读826次&#xff0c;点赞19次&#xff0c;收藏22次。BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是Google在2018年提出的一种自然语言处理&#xff08;NLP&…