Apache Flink与Stateful Function:提交作业时出现NoSuchMethodError错误
问题描述
- 技术栈:Apache Flink 1.17.0 + Stateful Functions 3.2.0(依赖
statefun-flink-datastream) - 问题现象:编写嵌入式有状态函数代码时抛出
NoSuchMethodError,IDE中能正常看到目标方法,但运行时找不到 - 异常堆栈:
Caused by: java.lang.NoSuchMethodError: 'org.apache.flink.streaming.api.datastream.DataStream org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator.getSideOutput(org.apache.flink.util.OutputTag)' at org.apache.flink.statefun.flink.core.translation.Sinks.lambda$sideOutputStreams$0(Sinks.java:73) ~[?:?] at org.apache.flink.statefun.flink.core.common.Maps.transformValues(Maps.java:54) ~[?:?] at org.apache.flink.statefun.flink.core.translation.Sinks.sideOutputStreams(Sinks.java:73) ~[?:?] at org.apache.flink.statefun.flink.core.translation.StatefulFunctionTranslator.translate(StatefulFunctionTranslator.java:62) ~[?:?] at org.apache.flink.statefun.flink.core.translation.EmbeddedTranslator.translate(EmbeddedTranslator.java:61) ~[?:?] at org.apache.flink.statefun.flink.datastream.StatefulFunctionDataStreamBuilder.build(StatefulFunctionDataStreamBuilder.java:157) ~[?:?]
解决方案
1. 修复版本兼容性问题
Stateful Functions 3.2.0官方兼容的Flink版本为1.14.6、1.15.3,与Flink 1.17.0存在API不兼容:
- 若要保留Flink 1.17.0,需升级Stateful Functions至3.4.0及以上版本(该版本开始支持Flink 1.17)
- 若要保留Stateful Functions 3.2.0,需降级Flink至1.15.3版本
2. 排查并解决依赖冲突
运行时找不到方法可能是因为依赖树中混入了低版本的Flink Streaming模块:
- Maven项目执行
mvn dependency:tree,Gradle项目执行./gradlew dependencies查看依赖树 - 找到所有引入低版本Flink的依赖,通过
<exclusions>(Maven)或exclude(Gradle)排除冲突模块,确保运行时仅加载目标版本的Flink类
3. 对齐IDE与运行时依赖
IDE中能看到方法是因为编译时依赖正确,但运行时可能加载了旧版本JAR:
- 清理项目构建缓存(Maven:
mvn clean,Gradle:./gradlew clean) - 确认打包后的产物中仅包含目标版本的Flink和StateFun依赖,无冗余旧版本JAR
内容的提问来源于stack exchange,提问作者Upkar Singh
相关产品推荐
相关产品推荐

