赞
踩
运行 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 等等,并且这一问题往往有伴随着一种很“诡异”的表现:
${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/
目录下添加一个与接口类同名的文件,并
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。