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

这篇具有很好参考价值的文章主要介绍了我成为开源贡献者的原因竟然是做MySql-CDC数据同步。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

贡献经历

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

碰到问题

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

尝试解决

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

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

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

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

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

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

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

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

找到原因

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

阅读源代码

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

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

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

动手解决

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

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

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

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

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

当然这个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检查失败的输出,我们可以看到在某个类中的某些代码未通过格式检查。

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

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

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

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

本文由 白鲸开源科技 提供发布支持!文章来源地址https://www.toymoban.com/news/detail-820432.html

到了这里,关于我成为开源贡献者的原因竟然是做MySql-CDC数据同步的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 解决 Linux git push 贡献者不同(没有出现绿点)的问题

    解决 Linux git push 贡献者不同(没有出现绿点)的问题

    第一步,通过下面的指令,修改 linux git 的配置文件: 会进入下图界面: 进入本地(Windows)中 git 的设置界面 复制 名称 和 Email 到 gitconfig 里,不要在末尾加 (空格) 。 vim 保存: shift + ; wq Enter

    2024年02月04日
    浏览(18)
  • 频繁FullGC的原因竟然是“开源代码”

    首先java语言的特性是不需像C和C++那样自己手动释放内存,因为java本身有垃圾回收机制(垃圾回收称为GC), 顾名思义就是释放垃圾占用的空间,防止内存泄露。JVM运行时占用内存最大的空间就是堆内存,另外栈区和方法区也会占用空间但是占用有限本章就不探究了。那么堆

    2024年02月16日
    浏览(11)
  • 开源贡献难吗?

    开源贡献难吗?

    本文整理自字节跳动 Flink SQL 技术负责人李本超在 CommunityOverCode Asia 2023 上的 Keynote 演讲,李本超根据自己在开源社区的贡献经历,基于他在贡献开源社区过程中的一些小故事和思考,如何克服困难,在开源社区取得突破,并且在工作和开源贡献之间取得平衡的相关内容,跟大

    2024年02月08日
    浏览(8)
  • 参与开源之夏 x OpenTiny 跨端跨框架 UI 组件库贡献,可以赢取奖金?!这份《OpenTiny 开源贡献指南》请收好?!

    参与开源之夏 x OpenTiny 跨端跨框架 UI 组件库贡献,可以赢取奖金?!这份《OpenTiny 开源贡献指南》请收好?!

    大家好,我是 Kagol。 近期有几位朋友在 OpenTiny 技术交流群里询问我们在开源之夏(OSPP)的项目,希望能提前做一些准备工作。 这里给大家简单介绍下开源之夏。 开源之夏是由中科院软件所“开源软件供应链点亮计划”发起并长期支持的一项暑期开源活动,旨在鼓励在校学生积

    2023年04月16日
    浏览(13)
  • 持续贡献开源力量,棱镜七彩加入openKylin

    持续贡献开源力量,棱镜七彩加入openKylin

    近日,棱镜七彩签署 openKylin 社区 CLA(Contributor License Agreement 贡献者许可协议),正式加入openKylin 开源社区。 棱镜七彩成立于2016年,是一家专注于开源安全、软件供应链安全的创新型科技企业。自成立以来,全面深耕于开源生态及信创产业,依托强大的数据和技术积累,自

    2024年02月14日
    浏览(8)
  • 记一次kernel patch(附开源贡献相关)

    看了zhihu上的一些科普,明白二次开发是常见现象,套壳、抄袭、自研都不是很科学的说法。中外大厂都会在AOSP、linux kernel、ffmpeg播放器、chromium等常见的祖先上进行自己的定制,发布自己的发行版。 龙蜥操作系统,来自阿里云,设计目的之一是接管centos留下的烂摊子,用于

    2024年02月14日
    浏览(13)
  • uniapp中开发小程序使用ref获取dom实例,一直显示undefined,竟然发现是这个原因!

    小程序是不能使用getElementById之类的dom api,所以考虑使用ref来获取dom元素,但事实上并不是如此,绑定ref后并没有输出我想要的dom元素。 既然console.log(this.$refs.iRef)为undefined,会不会this.$refs也是undefined?然而this.$refs是有值的,就是没有iRef,那么到底是为什么? 会不会是需要

    2024年02月11日
    浏览(9)
  • 【共建开源】手把手教你贡献一个 SeaTunnel PR,超级详细教程!

    【共建开源】手把手教你贡献一个 SeaTunnel PR,超级详细教程!

    Apache SeaTunnel是一个非常易于使用的、超高性能的分布式数据集成平台,支持海量数据的实时同步。每天可稳定高效同步数百亿数据,已被近百家企业投入生产使用。 现在的版本不支持通过jtds的方式链接sqlserver,我们来自己写代码来实现它,并把代码提交给apache seatunnel。 1

    2024年02月09日
    浏览(32)
  • 【Python程序开发系列】利用git实现协同开发做开源贡献(完整过程)

    【Python程序开发系列】利用git实现协同开发做开源贡献(完整过程)

    这是我的_ 第221篇 _原创文章。 写在前面 『数据杂坛』以 Python语言 为核心,垂直于 数据科学 领域,专注于(可戳👉) Python程序开发|数据采集|数据分析 |数据可视化| 特征工程| 机器学习 | 时序数据| 深度学习 | 人工智能 等技术栈交流学习,涵盖 数据挖掘 、 计算机视觉 、

    2024年03月24日
    浏览(10)
  • 如何在GitHub正确提PR(Pull Requests),给喜欢的开源项目贡献代码

    如何在GitHub正确提PR(Pull Requests),给喜欢的开源项目贡献代码

    最好的中文TTS项目Bert-vits2更新了中文特化分支,但可能由于时间仓促,代码中存在不少的bug,作为普通用户,有的时候也想为自己喜欢的开源项目做一点点贡献,帮助作者修改一些简单的bug,那么该如何开始? 本次我们以Bert-vits2项目为例子,分享正确提交PR(Pull Requests)的方

    2024年02月22日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包