Flink CDC里本地可以跑通,生产上就报错了为啥?Caused by: java.lang.ClassCastException: cannot assign instance of org.apache.flink.connector.jdbc.internal.options.InternalJdbcConnectionOptions to field org.apache.flink.connector.jdbc.table.JdbcOutputFormatBuilder.jdbcOptions of type org.apache.flink.connector.jdbc.internal.options.JdbcConnectorOptions in instance of org.apache.flink.connector.jdbc.table.JdbcOutputFormatBuilder at java.io.ObjectStreamClass$FieldReflector.setObjFieldValues(ObjectStreamClass.java:2087) ~[?:?]这个怎么解决?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您提供的报错信息,java.lang.ClassCastException
表明在生产环境中,Flink CDC作业尝试将一个对象实例赋值给不兼容的字段类型。具体来说,org.apache.flink.connector.jdbc.internal.options.InternalJdbcConnectionOptions
类型的对象无法被赋值给 org.apache.flink.connector.jdbc.internal.options.JdbcConnectorOptions
类型的字段。
这种问题通常发生在以下场景中: 1. 依赖冲突:生产环境和本地环境使用的依赖版本不一致,导致类加载器加载了不同的类定义。 2. 类加载顺序问题:不同环境中的类加载顺序可能导致某些类被错误地解析。 3. 连接器版本不匹配:Flink CDC连接器的版本与Flink运行时版本不兼容。
pom.xml
或build.gradle
文件,确保所有依赖的版本一致,并且没有重复引入。dependency:tree
命令(或Gradle的dependencies
命令)检查是否存在冲突的依赖。例如:
mvn dependency:tree | grep flink-connector-jdbc
<exclusions>
排除不必要的依赖。例如:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-jdbc_2.12</artifactId>
<version>1.15.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.flink</groupId>
<artifactId>flink-core</artifactId>
</exclusion>
</exclusions>
</dependency>
classloader.parent-first-patterns.additional
配置,确保冲突的类优先由父类加载器加载。例如:
classloader.parent-first-patterns.additional: org.apache.flink.connector.jdbc
provided
作用域,避免打包时重复引入。例如:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.12</artifactId>
<version>1.15.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.ververica</groupId>
<artifactId>flink-connector-mysql-cdc</artifactId>
<version>2.3.0</version>
</dependency>
JdbcOutputFormatBuilder
,确保其构造函数中传入的JdbcConnectorOptions
类型正确。log4j.properties
中添加:
log4j.logger.org.apache.flink=DEBUG
该问题的根本原因是依赖冲突或类加载顺序不一致。通过以下步骤可以有效解决: 1. 检查并统一生产环境和本地环境的依赖版本。 2. 配置classloader.parent-first-patterns.additional
以调整类加载顺序。 3. 确保Flink CDC连接器与Flink运行时版本兼容。 4. 验证生产环境的配置是否与本地环境一致。
如果问题仍未解决,请提供更详细的依赖树信息和生产环境配置,以便进一步分析。您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。
你好,我是AI助理
可以解答问题、推荐解决方案等