Flink1.15集群运行jar报错:多个'default'标识ExecutorFactory实现冲突
问题产生原因
- Flink 1.15集群的
lib目录下已经预置了Table模块相关核心组件,其中包含org.apache.flink.table.planner.loader.DelegateExecutorFactory这个ExecutorFactory实现类。 - 当前Maven配置未将
flink-table-planner_2.12、flink-table-runtime等Flink内置核心依赖设置为provided作用域,使用shade插件打胖包时,会将这些依赖中携带的org.apache.flink.table.planner.delegation.DefaultExecutorFactory类一并打包进业务JAR。 - 业务JAR提交到集群运行时,类加载器通过SPI机制扫描Factory实现时,会同时发现集群内置的Factory和业务JAR内自带的同标识Factory,两个实现类冲突就会抛出该歧义异常。
- 本地IDE运行时不存在集群预置的Flink组件,仅加载POM中引入的依赖,因此不会触发该冲突。
解决方法
按照以下步骤调整POM配置后重新打包即可:
为所有Flink集群内置的核心依赖添加
<scope>provided</scope>配置,让这类依赖仅参与本地编译、IDE运行阶段,不会被打包进业务胖JAR。需要调整的依赖包括:- 核心依赖:
flink-streaming-java、flink-clients - Table相关依赖:
flink-table-api-java-bridge、flink-table-api-scala-bridge_2.12、flink-table-runtime、flink-table-planner_2.12、flink-connector-files、flink-csv
调整后的依赖示例:
<!-- Flink 核心依赖 --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-java</artifactId> <version>${flink.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-clients</artifactId> <version>${flink.version}</version> <scope>provided</scope> </dependency> <!-- Flink Table 相关依赖 --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-table-api-java-bridge</artifactId> <version>${flink.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-table-api-scala-bridge_2.12</artifactId> <version>${flink.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-table-runtime</artifactId> <version>${flink.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-table-planner_2.12</artifactId> <version>${flink.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-files</artifactId> <version>${flink.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-csv</artifactId> <version>${flink.version}</version> <scope>provided</scope> </dependency>- 核心依赖:
保留非集群内置依赖的默认
compile作用域,这类依赖会被正常打进胖JAR,包括:flink-connector-kafka、kafka-clients、jackson-databind、org.json等第三方工具、连接器依赖。执行
mvn clean package命令清理旧构建产物,重新生成业务JAR包后提交到集群即可正常运行。
注意:如果使用的Flink发行版没有内置Kafka连接器,
flink-connector-kafka和对应版本的kafka-clients需要保留compile作用域打进JAR,否则会报类找不到错误。
内容的提问来源于stack exchange,提问作者user1112259
相关产品推荐
相关产品推荐

