当前位置:   article > 正文

Flink: Could not find any factory for identifier kafka/jdbc/hive implements DynamicTableFactory 根治方法_org.apache.flink.table.api.validationexception: co

org.apache.flink.table.api.validationexception: could not find any factory f

运行 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/目录下添加一个与接口类同名的文件,并

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/923470
推荐阅读
相关标签
  

闽ICP备14008679号