Flink CDC中我昨天提了一个issue,从MySQL同步数据到doris,如果MySQL的表的主键有多个列,且第一个列是varchar,且第一个列重复的值非常多,分片成chunk的时候每个chunk的数据就会有很多很多行,有几百万行,这个会导致flink的内存爆?https://github.com/ververica/flink-cdc-connectors/issues/2676 [Bug] flink-connector-mysql-cdc-2.4.2 when a multi-column primary key index starts with a varchar column, a snapshot chunk can potentially return a large number of rows and cause jvm to OOM. #2676
这个问题描述了在多列主键中存在字符串类型(如 varchar)时,可能导致 Flink CDC 中的内存溢出。
对于这种情况,目前的解决方法是通过调整配置参数 scan.incremental.snapshot.chunk.size.bytes 来限制单次 chunk 的大小。例如,如果默认值为 10M,则每个 chunk 将包含不超过 10MB 的数据。您可以根据实际情况调整此参数,以便将每个 chunk 的大小限制在合理的范围内。
另外,可以考虑设置其他列为主键的一部分,以避免将整个列设为主键导致主键长度过长。
这个问题是由于Flink CDC在获取MySQL表的全量数据时,使用了多列主键索引,且第一列是VARCHAR类型,导致每个分片(chunk)的数据量过大,超过了Flink任务的内存限制,从而导致OOM。
为了解决这个问题,你可以尝试以下方法:
调整Flink任务的内存配置,例如增加JVM的堆内存大小,或者调整Flink任务的并行度,以减少每个分片的数据量。
在MySQL数据库中,尝试将多列主键索引的第一列改为非VARCHAR类型,以减少每个分片的数据量。
在Flink CDC的任务中,尝试使用更小的分片大小,以减少每个分片的数据量。
如果可能,可以尝试在MySQL数据库中添加额外的索引,以提高查询性能,从而减少每个分片的数据量。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。