在EMR上运行Flink应用时遭遇scala.Product方法缺失错误求助
问题解决思路
这个错误是典型的Scala版本二进制不兼容导致的,根源是你的应用编译时的Scala版本(2.12.7)与EMR集群环境中的Scala版本不匹配,或者Scallop依赖的Scala版本与集群环境冲突。以下是具体解决步骤:
先确认集群环境的Scala版本:
登录EMR集群节点,执行scala -version查看系统Scala版本;同时检查Flink安装目录lib下的scala-library-*.jar版本,确认Flink依赖的Scala版本。EMR 5.34.0默认可能搭载Scala 2.11.x,而你用2.12.7编译的代码在2.11环境下会出现此类方法找不到的错误。匹配依赖的Scala版本:
- 如果集群是Scala 2.11环境:
- 降级Scallop到支持Scala 2.11的版本(比如3.5.1,Scallop 4.x系列仅支持Scala 2.12+);
- 切换应用编译的Scala版本为2.11.x(与集群一致),同时调整Flink依赖为对应Scala 2.11的版本(比如
org.apache.flink:flink-scala_2.11:1.13.1)。
- 如果集群支持Scala 2.12:
- 确保集群中的Flink是针对Scala 2.12编译的发行版;
- 确认Scallop 4.1.0的依赖是基于Scala 2.12构建的(Scallop 4.1.0默认支持2.12)。
- 如果集群是Scala 2.11环境:
打包时排除冲突依赖:
在构建工具(sbt/Maven)中,将scala-library设置为providedscope,避免把编译时的Scala库打包进应用jar包,强制使用集群环境中的Scala库:- SBT配置:
libraryDependencies += "org.scala-lang" % "scala-library" % "2.12.7" % Provided - Maven配置:在
scala-library的<dependency>中添加<scope>provided</scope>
- SBT配置:
统一依赖版本:
在构建配置中强制统一所有依赖的Scala版本,避免传递依赖引入不一致的Scala库。比如SBT中使用scalaVersion := "2.12.7",并通过dependencyOverrides强制其他依赖使用该版本的Scala库。
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

