解决flink Caused by: java.lang.NoClassDefFoundError: org/apache/flink/table/delegation/ExtendedOperationExecutor
运行flink代码报错:
运行报错:Exception in thread "main" org.apache.flink.table.api.TableException: Unexpected error when trying to load service provider.
at org.apache.flink.table.factories.FactoryUtil.discoverFactories(FactoryUtil.java:826)
at org.apache.flink.table.factories.FactoryUtil.discoverFactory(FactoryUtil.java:525)
at org.apache.flink.table.api.internal.TableEnvironmentImpl.create(TableEnvironmentImpl.java:295)
at org.apache.flink.table.api.internal.TableEnvironmentImpl.create(TableEnvironmentImpl.java:266)
at org.apache.flink.table.api.TableEnvironment.create(TableEnvironment.java:95)
at com.xxx.a_jobs.FlinkBatchHiveJob$.main(FlinkBatchHiveJob.scala:35)
at com.xxx.a_jobs.FlinkBatchHiveJob.main(FlinkBatchHiveJob.scala)
Caused by: java.util.ServiceConfigurationError: org.apache.flink.table.factories.Factory: Provider org.apache.flink.table.planner.delegation.DefaultDialectFactory could not be instantiated
at java.util.ServiceLoader.fail(ServiceLoader.java:232)
at java.util.ServiceLoader.access$100(ServiceLoader.java:185)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:384)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
at org.apache.flink.table.factories.FactoryUtil.discoverFactories(FactoryUtil.java:817)
... 6 more
Caused by: java.lang.NoClassDefFoundError: org/apache/flink/table/delegation/ExtendedOperationExecutor
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
at java.lang.Class.getConstructor0(Class.java:3075)
at java.lang.Class.newInstance(Class.java:412)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:380)
... 9 more
Caused by: java.lang.ClassNotFoundException: org.apache.flink.table.delegation.ExtendedOperationExecutor
报错的核心问题是在加载 Flink 的服务提供程序时出现了异常。具体的错误信息是 java.lang.NoClassDefFoundError: org/apache/flink/table/delegation/ExtendedOperationExecutor
和 java.lang.ClassNotFoundException: org.apache.flink.table.delegation.ExtendedOperationExecutor
。这通常是由于类缺失或者缺少相应的依赖库导致的。
解析错误信息
- 错误描述:Copy Code
Caused by: java.lang.NoClassDefFoundError: org/apache/flink/table/delegation/ExtendedOperationExecutor
这是因为org.apache.flink.table.delegation.ExtendedOperationExecutor
类未找到。Flink 在尝试加载这个类时,发现它不存在。这通常意味着某个必需的类库没有被正确包含在项目的依赖中。 - 原因分析:
- Flink 依赖的类库中缺少了某些必需的 JAR 文件,或者你的项目中缺少某些必要的依赖。
- 可能是因为缺少了 Hive 相关的依赖,或者使用的 Flink 版本与 Hive 连接的依赖不兼容。
- 另外,
org.apache.flink.table.planner.delegation.DefaultDialectFactory
类在创建时也无法实例化,这表明整个 Flink SQL 引擎的配置或者依赖加载出现了问题。
解决方案
1. 检查依赖:
确保你的项目中包含了 Flink 和 Hive 的相关依赖,特别是你使用的 Flink 版本与 Hive 相关的 JAR 文件。
对于 Flink 1.17.1 和 Hive,你应该确保以下依赖被正确添加到项目中:
- Flink和hive 依赖:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner_2.11</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-java-bridge</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-hive_2.11</artifactId>
<version>1.17.1</version>
</dependency>
2. 检查兼容性:
确保你所使用的 Flink 版本与 Hive 连接器的版本兼容。在 Flink 1.17.x 中,某些老旧的 Hive 连接器可能会出现兼容性问题。你可以查阅 Flink 官方文档 查看兼容的版本。