标题: Flink: Could not find any factory for identifier kafka/jdbc/hive imple [打印本页] 作者: 石小疯 时间: 2024-7-13 09:58 标题: Flink: Could not find any factory for identifier kafka/jdbc/hive imple 运行 Flink 应用或执行 Flink SQL 时会经常碰到下面的错误:
org.apache.flink.table.api.ValidationException: Could not find any factory for identifier ‘???’ that implements ‘org.apache.flink.table.factories.DynamicTableFactory’ in the classpath.
其中 identifier 可以是 kafka, jdbc, hive, hudi 等等,而且这一题目通常有伴随着一种很“诡异”的表现:
如果步伐打包成 uber-jar,全部相关 Connector Jar 包的 class 都在里面,此题目肯定会出现
如果单独将相关 Connector 的 Jar 包部署到 ${FLINK_HOME}/lib 目次下,题目就不会出现
导致这一题目的根源并非相关 Connector 的 Jar 包没有添加到步伐依赖中,或者在打成 uber-jar 的过程中丢失了 class 文件,而是由于一个更隐秘的缘故原由:Java 的 Service Provider Interface (SPI)机制。
在 Flink 的 Table API & SQL 框架下,各类 Connector 和 Format 必要提供 org.apache.flink.table.factories.DynamicTableFactory 这一接口的具体实现,从而把本身“注册”或者说“嵌入”到 Flink 运行情况中,而这必要在生成的 Jar 包中往 META-INF/services/目次下添加一个与接口类同名的文件,并