我成为开源贡献者的原因竟然是做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社区,以及贡献的经历,相信大家看了我的经历会发现开源离自己并不是那么的遥远,当然也希望有更多小伙伴能够积极参与进来!

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

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

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

相关文章

云服务器部署Stable Diffusion Webui从0到1总结:反复重启+循环debug

文章目录 在学校服务器部署Stable Diffusion Webui(一)准备工作(二)环境配置(三)git拉取项目到本地(四)运行项目 遇到的问题:(一)使用git clone时…

JAVAEE初阶 多线程进阶(二)

多线程进阶相关知识点 一.CAS1.1 CAS的原子类1.2 实现自旋锁1.3CAS中的ABA问题1.4 ABA问题的解决 二. callable接口三.reentrantLock3.1 reentrantLock与synchronized区别 四.信息量 semaphore五. CountDownLatch六. concurrentHashMap6.1 concurrentHashMap的优点 一.CAS CAS …

如何解决csgo搬砖饰品买了跌价的问题

大家好,我是阿阳。 经常有粉丝问:近期是该买还是该抛,每次买了就跌,抛了就涨,太揪心了。 在这聊聊阿阳自己对这个问题的看法,首先大家都知道csgo游戏搬砖从饰品持有时间长短,可以分为两类&…

【Python学习】Python学习20- 面向对象(1)

目录 【Python学习】Python学习20- 面向对象(1) 前言面向对象技术简介类的创建实例:创建实例对象访问属性 Python内置类属性完整代码输出 参考 文章所属专区 Python学习 前言 本章节主要说明Python的面向对象的处理。Python从设计之初就已经…

【Python学习】Python学习19- 异常处理

目录 【Python学习】Python学习19- 异常处理 前言python标准异常异常处理带异常类型语法不带异常类型语法使用except而带多种异常类型try-finally 语句触发异常 参考 文章所属专区 Python学习 前言 本章节主要说明Python的异常处理。 python标准异常 BaseException 所有异常…

中级Python面试问题

文章目录 专栏导读1、xrange 和 range 函数有什么区别?2、什么是字典理解?举个例子3、元组理解吗?如果是,怎么做,如果不是,为什么?4、 列表和元组的区别?5、浅拷贝和深拷贝有什么区别…

微信小程序上传并显示图片

实现效果&#xff1a; 上传前显示&#xff1a; 点击后可上传&#xff0c;上传后显示&#xff1a; 源代码&#xff1a; .wxml <view class"{{company_logo_src?blank-area:}}" style"position:absolute;top:30rpx;right:30rpx;height:100rpx;width:100rp…

在vue中,切换页面之后如何关闭定时器

在vue中&#xff0c;使用了element-ui的框架&#xff0c;点击左侧切换内部页面。 有些页面使用了定时器&#xff0c;在其换到其他页面的时候&#xff0c;希望能够关闭这些定期请求和复杂操作。 那么&#xff0c;切换页面之后如何关闭定时器&#xff1f;vue的创建流程中没找到能…

OWASP漏洞原理启航(第一课)

OWASP Top 10 2021 介紹 漏洞原理启航介绍 OWASP 定义&#xff1a; AI介绍 OWASP (开放Web应用程序和安全项目) 是一个全球性的社区&#xff0c;致力于提供关于Web应用程序安全性的信息、教育和支持。OWASP是一个非盈利组织&#xff0c;由志愿者驱动&#xff0c;旨在提高Web应…

从“精益思想“看机器人的开发与应用:一场科技与效率的完美融合

在科技飞速发展的今天&#xff0c;机器人已经深入到我们的生活和工作之中&#xff0c;成为了提高效率、提升质量的重要工具。然而&#xff0c;如何让机器人的开发和利用更有效率、更精细&#xff0c;这是摆在我们面前的一道难题。此时&#xff0c;"精益思想"的出现&a…

记ubuntu2004通过NetworkManager修改网络的优先级

这里写自定义目录标题 前言步骤 前言 起因在于万恶的校园网&#xff0c;突然台式有线死活没法认证&#xff08;感觉是IP冲突了&#xff1f;另外一台电脑同样的系统就没有问题&#xff0c;连路由器WIFI也是可以的&#xff0c;路由器设置的是桥接模式&#xff0c;有没有大佬提供…

不分青红皂白,美杜莎勒索软件攻击慈善饮用水机构Water for People

据The Record网站消息&#xff0c;1月11日&#xff0c;勒索软件组织美杜莎&#xff08;Medusa&#xff09;在其暗网受害名单网站上列出了 Water for People——一家专为贫困地区提供清洁饮用水的非盈利组织。 美杜莎向该组织索要30万美元赎金&#xff0c;否则将公布被盗信息。W…

表单验证 ---- 在Vue2中使用ElementUI进行表单验证

目录 前言 给表单绑定对应属性 在data中定义数据对象和表单的定义规则 与数据对象双向绑定 对整个表单进行验证 前言 在做项目时&#xff0c;对于表单进行验证是我们必不可少的 例如 搭建一个基本的登录界面 <div class"form"><h1>登录</h1>&…

拼图小游戏(实现游戏主界面)(未连接数据库)

注释&#xff1a; 基于IDEA&#xff0c;创建窗体进行游戏 默认的用户名和密码为&#xff1a;zhangsan,123 lisi,1234 App界面 package marchwho.ui;public class App {public static void main(String[] args) {//登录的窗体new LogInJFrame();//注册的窗体// new Registe…

操作系统复习 九-十二 章

操作系统复习 九-十二 章 文章目录 操作系统复习 九-十二 章第九章 单处理器调度调度的概念调度的时机、切换与过程进程调度方式调度的基本准则进程的挂起态与七状态模型典型的调度算法 第十一章 I/O管理和磁盘调度I/O 设备I/O控制方式I/O子系统的层次结构IO子系统概述IO调度概…

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

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

Spring Boot中操作数据库的几种并发事务方式

当有多个并发事务时&#xff0c;会发生丢失更新异常。来自一个或多个事务的更新可能会丢失&#xff0c;因为其他事务会用其结果覆盖它。 让我们通过一个例子来检验一下。考虑以下执行事务的方法。 public void withdraw(Long accountId, double amount) { Account account a…

解决防爬虫机制方法(二)

最近为了完成学校的大数据的作业&#xff0c;老师要我们爬一个的网站&#xff0c;里面有还算不错的防爬机制&#xff0c;忙活了几天&#xff0c;总结出一些常见的防爬机制的应对方法&#xff0c;方法均来自个人实战总结&#xff0c;非专业爬虫角度分析 承接上一次讲的方法解决…

OpenAI 悄然更新使用政策

据 The Intercept 报道&#xff0c;OpenAI 近日悄然在其使用政策中删除了「明确禁止将其技术用于军事目的」的措辞。 截至 1 月 10 日&#xff0c;OpenAI 的「使用政策」页面还包括禁止「具有高人身伤害风险的活动」&#xff0c;特别是应用于「武器开发」和「军事和战争」。 而…

MedSegDiff: Medical Image Segmentation with Diffusion Probabilistic Model

摘要 Diffusion probabilistic model (DPM) recently becomes one of the hottest topic in computer vision. Its image generation application such as Imagen, Latent Diffusion Models and Stable Diffusion have shown impressive generation capabilities, which arouse…