ITPub博客

首页 > 数据库 > 数据库开发技术 > Flink CDC 3.1.1,生产表现如何?

Flink CDC 3.1.1,生产表现如何?

原创 数据库开发技术 作者:安瑞哥是码农 时间:2024-08-09 08:35:14 0 删除 编辑


上篇文章记录了最新 Flink CDC 3.1.1 的部署,以及它的功能表现,从部署过程来看,有些地方表现的很蛋疼,官方文档描述不清不楚,个别的设计逻辑也让人分分钟想打人。


不过好在,结局还行,该有的功能,咱最终还是都给他跑出来了,可喜可贺。


如果说上一次的功能性测试只是洒洒水,那么这一次,咱就给它拉到生产环境,看它在面对凶险的环境下,表现如何?



0. 凶险设置


讲道理,为了避免给自己惹太大的麻烦,我这里先选一张数据量相对没辣么大的,26个字段,已经有80w+(数据文件大小为4个G)历史数据的 MySQL 表先试试水。



准备把这部分历史数据,用 Flink CDC 3.1.1,给同步到 Kafka。


理论上,如果以当前 Flink CDC 默认的内存大小、并行度、以及数据读取速率的话,我猜,很可能在数据导入过程中出现 OOM。


那针对这个 OOM,咱们准备两种应对策略:


策略1:在进程默认内存大小、并行度不变的情况下,调整可能的数据读取速率,让它时间单位读取的效率低一点;


策略2:修改默认的 CDC 内存大小(taskmanager内存),让它满足对应的内存需求。



1. 默认参数情况下


所谓默认,就是我啥参数都不动的情况下去跑。


任务启动后,默认是3个并行度,启动了3个 taskmanager,每个 taskmanager 分配一个 slot。



大概1分钟左右,导出数据量约为 40w 的时候,就不出意外的嗝屁了,原因就是:内存不足:



先来瞅一眼,默认情况下,我们的 jobmanager 跟 taskmanager 内存大小。


jobmanager堆内存大小



taskmanager堆内存大小



说明这个时候,默认的内存大小,满足不了当前默认的数据读取速率。


既然这样,那咱就改。



2. 设置读取效率参数


从官网对这个 CDC 参数介绍来看,貌似提供了一些可以控制数据读取速率的参数(至少它是这么解释的)。





既然找到了,那就试试呗。


于是我就把这3个参数,都给配到了 CDC 任务的主配置文件里,经过多次参数的调整、这个值是越调越低,最后都调到下面这个样子了。



然鹅,从实际测试效果来看,几乎没有任何卵用,我没看到任何数据读取速率上的变化,而且,抛出的异常还是跟原来一个鸟样。


也就是说,这个参数,就是个废的。


(莫非是我设置的不对?如果是,那只能说明官方文档太垃圾)



3. 调整内存大小


既然尝试通过修改数据读取速率行不通,那咱就只能尝试添加任务的运行内存了。


对于当前的这个 Flink CDC 任务来说,jobmanager 的内存大小是可以不用管的,毕竟它又不干活。


我们要调整的,核心是 taskmanager 内存,调谁?


根据官网的介绍,咱暂时优先调整「taskmanager.memory.process.size」这个参数。



从 Flink 的配置文件来看,默认值为「1728m」,既然这个小了,那咱就挨个往上调。


先调到「2000m」试试




这个时候,taskmanager 的堆内存为:



而且当前运行有 3 个 taskmanager,也就是一共消耗了 6G 内存。


但,还是太小了,依然 OOM。


再调到「3000m」试试



这个时候,每个 taskmanager 的堆内存为:



当前 3个 taskmanager,一共消耗了 9G 内存。


然而,还是不行,依然 OOM。


再调到「5000m」试试



这个时候,每个 taskmanager 的堆内存为:



当前 3个 taskmanager,一共消耗了 15G 内存。


说出来你可能不信,就这张大小只有 4G 的 MySQL 表,当前内存条件下,依然不够,在导出数据量在 40w+ 的时候,还是 OOM 了。


继续调到「6000m」试试



这个时候,每个 taskmanager 的堆内存为:



当前 3个 taskmanager,一共消耗了 18G 内存。


这一次,它终于行了。



80w+ 条数据,3个并行度,耗费近 20G 的内存,才勉强能把它导完,就问你惊不惊喜,意不意外吧。


从上图的显示来看,明明发送的数据量才不到 2G,又不存在数据间的逻辑运算,却要耗费这么大的内存空间,其他内存都干嘛了呢?



4. 几个槽点


各种尝试之后,总算是把这张不怎么大的表给导完了,测试过程中,有几个槽点,不吐不快:


槽点1:数据读取速率没法控制,虽然官网给了一些看上去可以设置速率的参数,但实际上屁用没有;


槽点2:任务运行参数设置过于奇葩。


你会发现,CDC 任务的并行度,可以通过具体的 CDC 任务配置文件来设置(这个合理)。但任务的内存大小参数,又只能通过 Flink 的配置文件(注意还不是 Flink CDC 的配置文件)来设置,或者只能在启动 yarn-session 的时候设置,这就会让你在实际操作过程中,特别的麻烦。


这要是没个几年脑血栓后遗症,我实在想不出哪个正常人可以做出这样的设计,咱就不能换一个脑子正常点的人来吗?


槽点3:失败任务默认会无限次重试。


如果导入过程中因为 OOM 异常了,这个 CDC 程序就会跟个神经病一样,一直去重启任务。


从 web 页面看,一会它是这样的:



一会又变成这样的:



然后它又变成这样:



如此这般循环往复,周而复始,都一个多小时了,你会发现,它根本停不下来。



咱就是说,既然重试了几次都不行,那就说明是真的不行,这个时候,停下来,就是进步,懂不懂?(学学人家Spark好不好呢)



最后


虽然生产咱也上了,问题也碰到了,也最终解决了,但总感觉内心没那么痛快。


对于 Flink CDC 任务(或者说所有的 Flink 任务)来说,当前它的这个内存管理,在我看来有点迷。


那为了解开这个迷,我决定再来一期关于 Flink 任务内存管理的内容,你们乐意看不?




你可以添加我的私人微信,拉你入技术讨论群,跟一群热爱技术的小伙伴一起成长...


原文作者:安瑞哥是码农;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2022-02-16

  • 博文量
    228
  • 访问量
    115415