使用SBT运行Scala Spark应用报错问题求助
嗨,我来帮你搞定这个问题!纯Scala代码能正常跑,但一加Spark功能就卡壳,这情况我见得太多了,大概率是SBT依赖配置没到位,或者代码里有小细节没踩对,咱们一步步来排查:
第一步:检查SBT的build.sbt配置(最关键!)
Spark应用跑不起来,90%的原因都是依赖没配对。你得确保在build.sbt里添加了正确的Spark依赖,而且Scala版本要和Spark版本完全兼容——比如Spark 3.3.x对应Scala 2.12.x,Spark 3.4+可以用Scala 2.13.x。
给你个标准的配置示例:
name := "SparkHiApp" version := "0.1" scalaVersion := "2.12.15" // 必须和你的Spark版本匹配,别乱改! libraryDependencies ++= Seq( // Spark核心依赖,本地开发可以暂时去掉"provided",打包部署时再加回来 "org.apache.spark" %% "spark-core" % "3.3.2", // 如果用到Spark SQL,就加这个 "org.apache.spark" %% "spark-sql" % "3.3.2" )
这里解释下provided:集群环境本身已经自带Spark依赖,所以打包时加provided可以避免依赖冲突;但本地用SBT运行时,去掉它才能让SBT把Spark依赖拉到本地环境里。
第二步:调整Spark代码写法(适配新版本)
你原来的代码用的是SparkContext,现在Spark官方更推荐用SparkSession(它包含了SparkContext的功能,还整合了SQL、Streaming等模块),而且写法更简洁。修改后的代码如下:
import org.apache.spark.sql.SparkSession object hi { def main(args: Array[String]) { // 创建SparkSession实例 val spark = SparkSession.builder() .appName("hi") .master("local[2]") // 本地测试用,生产环境别硬写,通过提交参数指定 .getOrCreate() // 写个简单的Spark逻辑测试下,比如并行化一个集合 val testRDD = spark.sparkContext.parallelize(Seq("Hello", "Spark", "from", "SBT")) testRDD.foreach(println) // 记得用完要停止SparkSession,避免资源泄漏 spark.stop() } }
第三步:正确用SBT运行应用
打开终端,进入你的项目根目录,依次运行以下命令:
- 清理旧的编译文件:
sbt clean - 重新加载依赖并编译:
sbt compile - 运行应用:
sbt run
如果项目里有多个main类,SBT会让你选择对应编号,选hi那个就行。
第四步:解决依赖加载异常
如果还是报错,比如提示“找不到Spark相关类”,大概率是SBT缓存出问题了,运行这个命令清理缓存并重新拉取依赖:
sbt clean reload update
等依赖拉完再重新运行sbt run试试。
内容的提问来源于stack exchange,提问作者CoMacNo
相关产品推荐
相关产品推荐

