Spark独立集群任务资源无法分配问题排查求助
解决Spark Standalone集群Scala序列化版本不兼容问题
问题根源
从Worker节点的Executor日志可直接定位:java.io.InvalidClassException是因为Driver端与集群Worker端的Scala类序列化版本不匹配。虽然双方同属Scala 2.12分支,但小版本差异导致scala.collection.mutable.WrappedArray$ofRef的serialVersionUID不一致,Driver和Executor无法完成序列化通信,最终引发任务资源分配失败的报错。
解决方案
精确对齐Scala版本
- 先确认集群Spark使用的Scala精确版本:登录集群节点,进入
SPARK_HOME/jars目录,找到scala-library-*.jar,查看完整版本号(例如scala-library-2.12.10.jar)。 - 修改本地Maven项目中
scala-library的依赖版本,完全匹配集群版本:<dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>集群对应Scala版本号</version> <scope>provided</scope> <!-- 集群已自带该库,无需打包进应用jar --> </dependency>
- 先确认集群Spark使用的Scala精确版本:登录集群节点,进入
排查并排除依赖冲突
- 执行Maven命令检查依赖树,确认是否有其他依赖间接引入了不同版本的Scala库:
mvn dependency:tree | grep scala-library - 如果发现冲突,在对应的依赖中添加排除规则,例如某依赖引入了旧版Scala:
<dependency> <groupId>xxx</groupId> <artifactId>xxx</artifactId> <version>xxx</version> <exclusions> <exclusion> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> </exclusion> </exclusions> </dependency>
- 执行Maven命令检查依赖树,确认是否有其他依赖间接引入了不同版本的Scala库:
重新构建并验证
- 执行
mvn clean package清理并重新构建项目,确保依赖完全生效。 - 重新运行Driver程序,查看Worker节点的Executor日志,确认序列化异常是否消失。
- 执行
额外注意事项
- 你的
spark.executor.instances设置为100,但集群只有3个Worker节点,该配置远超集群实际资源承载能力,建议根据Worker的CPU、内存情况合理调整(例如每个Worker分配2-3个Executor)。 - 本地Driver读取
C:\Files\testData\data_2.txt属于本地路径,集群Worker节点无法访问该文件。后续任务正常运行后,需将数据文件放到HDFS、NFS等集群共享存储,或通过spark-submit的--files参数将文件分发到所有Executor节点。
内容的提问来源于stack exchange,提问作者vs777
相关产品推荐
相关产品推荐

