Java Spark程序中使用Cobrix遇scala/Product$class类缺失错误求助
在Java Spark程序中运行Cobrix遇到类/版本不匹配问题
有人尝试过在Java Spark程序中运行Cobrix吗?我在调用COBOL数据源时遇到了类/版本不匹配问题。执行以下spark-submit命令时:
spark-submit spark-cobol_2.11-2.6.9-bundle.jar --class com.test.cobol.App --master local target/spark-cobol-jay-1.0-SNAPSHOT.jar
出现如下错误:
23/12/27 16:45:50 INFO DefaultSource: Cobrix 'spark-cobol' build 2.6.9 (2023-10-16T10:52:47) Exception in thread "main" java.lang.NoClassDefFoundError: scala/Product$class at za.co.absa.cobrix.cobol.parser.recordformats.RecordFormat$FixedLength$.<init>(RecordFormat.scala:22)
问题原因及解决办法
1. 修正spark-submit命令参数顺序
spark-submit的正确语法是先指定运行参数(如--class、--master),再通过--jars引入依赖包,最后指定主应用jar。你当前的命令把Cobrix的bundle jar放在最前面,会被当作主应用jar解析,导致参数和依赖逻辑混乱。
修正后的命令示例:
spark-submit --class com.test.cobol.App --master local --jars spark-cobol_2.11-2.6.9-bundle.jar target/spark-cobol-jay-1.0-SNAPSHOT.jar
更推荐用--packages自动拉取匹配的依赖包,避免手动管理jar:
spark-submit --class com.test.cobol.App --master local --packages za.co.absa.cobrix:spark-cobol_2.11:2.6.9 target/spark-cobol-jay-1.0-SNAPSHOT.jar
2. 对齐Scala版本
scala/Product$class找不到的核心原因是Scala版本不匹配:
- 你使用的Cobox是基于Scala 2.11构建的(jar名中的
_2.11后缀),需要确认本地/集群的Spark环境也是基于Scala 2.11编译的。 - 如果你的Spark是Scala 2.12版本,需替换为对应版本的Cobrix包,比如
spark-cobol_2.12-2.6.9-bundle.jar。
3. 同步项目依赖配置
如果是Maven/Gradle项目,确保依赖中Cobrix的Scala版本与Spark一致:
Maven依赖示例(Scala 2.11):
<dependency> <groupId>za.co.absa.cobrix</groupId> <artifactId>spark-cobol_2.11</artifactId> <version>2.6.9</version> </dependency>
若Spark用Scala 2.12,将_2.11改为_2.12即可。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

