从IntelliJ直连Spark Master遇InvalidClassException问题求助
问题:IntelliJ直连Spark Standalone Master报错序列化版本不兼容
代码示例
def main(args: Array[String]) = { println("***hello spark-test***") val spark = SparkSession .builder() .master("spark://172.22.208.1:7077") .appName("Spark-Test Application") .getOrCreate() import spark.implicits._ val rawData = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) val rdd = spark.sparkContext.parallelize(rawData) val df = rdd.toDF() val result = df.filter($"value" % 2 === 1).count() println(s"***Result odd numbers count: $result ***") spark.stop() }
报错现象
应用日志卡在连接Master环节:
22/12/29 12:38:55 INFO StandaloneAppClient$ClientEndpoint: Connecting to master spark://172.22.208.1:7077... 22/12/29 12:38:55 INFO TransportClientFactory: Successfully created connection to /172.22.208.1:7077 after 38 ms (0 ms spent in bootstraps) 22/12/29 12:39:15 INFO StandaloneAppClient$ClientEndpoint: Connecting to master spark://172.22.208.1:7077...
Driver日志抛出序列化错误:
22/12/29 12:39:35 ERROR TransportRequestHandler: Error while invoking RpcHandler#receive() for one-way message. java.io.InvalidClassException: scala.collection.immutable.ArraySeq; local class incompatible: stream classdesc serialVersionUID = -8615987390676041167, local class serialVersionUID = 2701977568115426262
环境信息
- Spark集群版本:spark-3.3.0-hadoop3-scala2.13
- IntelliJ本地Scala版本:v2.13.5
- 备注:移除代码中的
master("spark://172.22.208.1:7077")后,打包用spark-submit提交可正常运行
解决方案
1. 对齐本地与集群的Scala版本
Spark 3.3.0对应Scala 2.13系列的2.13.8(可通过集群执行scala -version或官方文档确认),你本地用的2.13.5和集群版本不一致,导致ArraySeq的序列化ID不匹配。
- 操作步骤:
- 在IntelliJ中修改项目的Scala SDK为2.13.8
- 更新项目构建文件(build.sbt/pom.xml)中的Scala版本到2.13.8,重新编译
2. 直接引用集群的Spark依赖包
本地maven/gradle下载的Spark依赖可能和集群端的库存在细微差异,直接使用集群的jar包可避免版本不一致问题。
- 操作步骤:
- 在IntelliJ项目中移除原有Spark依赖,添加集群
$SPARK_HOME/jars目录下的所有jar包作为项目依赖
- 在IntelliJ项目中移除原有Spark依赖,添加集群
3. 用spark-submit参数指定Master(推荐)
本地开发时,代码中不硬编码master参数,通过运行配置传递参数,避免本地环境与集群的依赖冲突。
- 操作步骤:
- 代码中保留
.appName,移除.master("spark://...") - 在IntelliJ的Run Configuration中,设置
Program arguments为--master spark://172.22.208.1:7077 - 或者直接编译jar包,用
spark-submit命令提交:spark-submit --master spark://172.22.208.1:7077 --class your.package.MainClass your-jar-file.jar
- 代码中保留
内容的提问来源于stack exchange,提问作者beatrice
相关产品推荐
相关产品推荐

