问题描述
Flink1.16.3从doris ods读取数据 清洗转换重新写入 doris dwd执行任务报错异常
Caused by: java.io.InvalidClassException: org.apache.doris.flink.sink.DorisSink; local class incompatible: stream classdesc serialVersionUID = -865322684187455497, local class serialVersionUID = -1423003329053590571
原因分析:
从报错看出是stream classdesc serialVersionUID和local class serialVersionUID不一致导致的
1.先去本地Local环境下看看是否是Flink Sql错误导致的
执行成功!说明Flink sql是正确的
2.打包jar包提交给Flink
jar包也能执行成功!
3.那就只能去看rpc提交给Flink具体是什么了
在排查的过程中发现rpc提交的flink-doris-connector版本是1.3.0,但是Flink lib目录下是1.6.0 ,替换依赖版本后,bug解决!
解决方案:
- 检查Flink提交的任务是否能够执行 可以Local运行下任务看看
- 查看Flink部署是否有相关jar包
- 分析Flink任务提交方式 我这边用的是rpc 看下相关依赖是否匹配 是否打包进去了
在 Apache Flink 中,需要将相关依赖项放置在 Flink 的 lib 目录下或者通过其他配置方式提供给 Flink 的原因主要有几点:
运行时环境一致性:Flink 是一个分布式计算系统,它需要确保在整个集群中运行的程序使用的依赖项和版本是一致的。即使您的应用程序已经打包了相关依赖项,但如果这些依赖项与 Flink 集群中的版本不匹配,可能会导致运行时的冲突或者不兼容问题。
集群管理便捷性:将依赖项放在 Flink 的 lib 目录下,可以确保在启动 JobManager 和 TaskManager 时自动加载这些依赖项,而不需要手动管理每个任务的依赖。这种集中管理可以简化部署和维护,尤其是在大规模集群中管理多个应用程序时尤为重要。
外部连接器和库的支持:有些 Flink 的连接器或者库是作为扩展或者插件存在的,它们可能需要额外的 JAR 包支持。这些 JAR 包通常不会被您的应用程序直接依赖,而是由 Flink 运行时加载和使用。例如,如果使用 Kafka 连接器或者 Hadoop 文件系统连接器,通常需要额外的 JAR 包才能与这些系统进行交互。
类加载器隔离:Flink 使用了自定义的类加载器来隔离用户程序和 Flink 自身的类路径,以确保用户程序的类和依赖项不会与 Flink 的核心类产生冲突。这种隔离可以提高系统的稳定性和安全性,避免类路径冲突和意外的行为。
因此,尽管您的应用程序可能已经包含了所需的依赖项,但为了确保 Flink 集群中所有任务的一致性和稳定性,以及支持外部连接器和库,建议将所有必要的依赖项也配置在 Flink 的 lib 目录下或者通过相关配置提供给 Flink。这样能够确保您的应用程序在不同的部署环境中都能正常运行并获得预期的性能和功能。