如何通过SBT维护多项目模块 分别依赖Apache Spark 2.3与2.4
SBT多模块维护不同Spark版本依赖方案
项目层级设计
推荐采用平级独立子模块的目录结构,两个Spark业务模块完全隔离,避免依赖交叉冲突,可按需新增无Spark依赖的公共模块存放共享逻辑:
your-project-root/ ├── build.sbt # 全局SBT配置文件 ├── project/ │ └── build.properties # 指定SBT版本,建议使用1.5.x及以上稳定版本 ├── common/ # 可选:无Spark依赖的公共工具模块 │ └── src/ │ ├── main/ │ └── test/ ├── spark23-module/ # 依赖Spark 2.3的业务模块 │ └── src/ │ ├── main/ │ └── test/ └── spark24-module/ # 依赖Spark 2.4的业务模块 └── src/ ├── main/ └── test/
build.sbt 配置示例
无需在全局作用域声明Spark依赖,两个子模块各自配置专属的Spark版本即可,公共模块不绑定任何Spark版本:
// 全局统一Scala版本,Spark 2.3、2.4均兼容Scala 2.11 ThisBuild / scalaVersion := "2.11.12" ThisBuild / organization := "com.your.company" // 可选:公共工具模块,无Spark依赖,两个业务模块均可引用 lazy val common = (project in file("common")) .settings( name := "common-utils", version := "1.0.0", libraryDependencies ++= Seq( // 公共依赖,比如JSON工具、加密工具等 "com.alibaba" % "fastjson" % "1.2.83" ) ) // Spark 2.3 业务模块配置 lazy val spark23Module = (project in file("spark23-module")) .dependsOn(common) // 可选:依赖公共模块 .settings( name := "spark23-business", version := "1.0.0", libraryDependencies ++= Seq( "org.apache.spark" %% "spark-core" % "2.3.3" % Provided, "org.apache.spark" %% "spark-sql" % "2.3.3" % Provided, // 该模块其他专属依赖 ) ) // Spark 2.4 业务模块配置 lazy val spark24Module = (project in file("spark24-module")) .dependsOn(common) // 可选:依赖公共模块 .settings( name := "spark24-business", version := "1.0.0", libraryDependencies ++= Seq( "org.apache.spark" %% "spark-core" % "2.4.8" % Provided, "org.apache.spark" %% "spark-sql" % "2.4.8" % Provided, // 该模块其他专属依赖 ) )
使用注意事项
- 编译、打包、测试操作均按模块独立执行,比如打包Spark2.3模块执行
sbt spark23Module/assembly,打包Spark2.4模块执行sbt spark24Module/assembly,完全互不干扰 - Spark依赖统一标记为Provided,提交到Yarn集群运行时避免和集群自带的SparkJar产生冲突
- 若无需公共逻辑,可直接删除common模块的相关配置,不影响两个业务模块的独立运行
内容的提问来源于stack exchange,提问作者Akhil
相关产品推荐
相关产品推荐

