如何配置Spark的build.sbt文件?通用核心库配置失败求助
搞定Spark通用库的build.sbt配置问题
嘿,看你折腾了一整天还没搞定这个配置,我来帮你揪出问题,给你个能正常工作的方案!
先说说你当前配置里的几个致命问题
- Scala版本和Spark依赖不兼容:你用的Scala是
2.12.5,但Spark依赖写的是spark-core_2.10——这里的_2.10表示这个Spark包是基于Scala 2.10编译的,和你的Scala版本完全不搭,这是最核心的错误。 - Spark版本号没填全:你写的
"..."得换成具体的、和Scala 2.12兼容的Spark版本,比如2.4.8(2.x系列最后一个支持Scala2.12的版本)或者3.3.0(3.x系列稳定版)。 - sbt-assembly插件没启用:如果要把这个库打包成能在Spark里用的独立JAR,你得把注释掉的插件配置打开,而且注意插件版本要和你的sbt版本匹配(比如sbt 1.x得用0.15.x以上的assembly版本)。
修正后的完整build.sbt配置
name := "CommonLib" version := "0.1" scalaVersion := "2.12.5" // 启用sbt-assembly插件(适配sbt 1.x,如果你用sbt 0.13.x就换回0.14.6) addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.15.0") // 添加必要的依赖仓库 resolvers += Resolver.sonatypeRepo("public") resolvers += "Maven Central" at "https://repo1.maven.org/maven2/" // Spark依赖配置,用%%自动匹配Scala版本后缀 libraryDependencies ++= Seq( // 标记为Provided,因为Spark集群/本地环境已经自带这些核心库,打包时不重复打入 "org.apache.spark" %% "spark-core" % "2.4.8" % Provided, // 如果需要Spark SQL等其他模块,直接加下面这行就行 // "org.apache.spark" %% "spark-sql" % "2.4.8" % Provided ) // 配置assembly的合并策略,解决打包时的依赖冲突 assemblyMergeStrategy in assembly := { case PathList("META-INF", _*) => MergeStrategy.discard // 丢弃重复的META-INF文件 case other => MergeStrategy.first // 其他文件保留第一个出现的版本 }
几个关键细节要注意
- 用
%%代替手动写版本后缀:"org.apache.spark" %% "spark-core"会自动根据你的scalaVersion生成spark-core_2.12,再也不用手动写错版本号了。 - Provided作用域:把Spark依赖设为
Provided非常重要,不然打包出来的JAR会包含Spark核心库,不仅体积超大,还会和Spark环境里的库版本冲突。 - sbt-assembly版本匹配:如果你的sbt是0.13.x版本,就把assembly版本换回
0.14.6;如果是sbt 1.x,就用0.15.0及以上版本。 - 合并策略:这个配置是解决打包时常见的重复文件冲突的,比如多个依赖里都有META-INF下的配置文件,直接丢弃就好。
验证方法
- 把上面的配置保存成build.sbt。
- 跑
sbt compile看看编译能不能过,没问题的话再跑sbt assembly打包。 - 打包好的JAR会在
target/scala-2.12目录下,直接放到Spark项目里引用或者上传到集群用就行。
内容的提问来源于stack exchange,提问作者Wonay
相关产品推荐
相关产品推荐

