使用 sbt-spark-package 插件了解 build.sbt
Posted
技术标签:
【中文标题】使用 sbt-spark-package 插件了解 build.sbt【英文标题】:Understanding build.sbt with sbt-spark-package plugin 【发布时间】:2019-07-14 18:20:24 【问题描述】:我是新的 scala 和 SBT 构建文件。从介绍性教程中,将 spark 依赖项添加到 scala 项目应该是通过 sbt-spark-package 插件直接进行的,但我收到以下错误:
[error] (run-main-0) java.lang.NoClassDefFoundError: org/apache/spark/SparkContext
请提供资源以详细了解可能导致错误的原因,因为我想更彻底地了解流程。
代码:
trait SparkSessionWrapper
lazy val spark: SparkSession =
SparkSession
.builder()
.master("local")
.appName("spark citation graph")
.getOrCreate()
val sc = spark.sparkContext
import org.apache.spark.graphx.GraphLoader
object Test extends SparkSessionWrapper
def main(args: Array[String])
println("Testing, testing, testing, testing...")
var filePath = "Desktop/citations.txt"
val citeGraph = GraphLoader.edgeListFile(sc, filepath)
println(citeGraph.vertices.take(1))
plugins.sbt
resolvers += "bintray-spark-packages" at "https://dl.bintray.com/spark-packages/maven/"
addSbtPlugin("org.spark-packages" % "sbt-spark-package" % "0.2.6")
build.sbt -- 工作中。为什么 libraryDependencies 运行/工作?
spName := "yewno/citation_graph"
version := "0.1"
scalaVersion := "2.11.12"
sparkVersion := "2.2.0"
sparkComponents ++= Seq("core", "sql", "graphx")
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "2.2.0",
"org.apache.spark" %% "spark-sql" % "2.2.0",
"org.apache.spark" %% "spark-graphx" % "2.2.0"
)
build.sbt -- 不工作。希望它能够正确编译和运行
spName := "yewno/citation_graph"
version := "0.1"
scalaVersion := "2.11.12"
sparkVersion := "2.2.0"
sparkComponents ++= Seq("core", "sql", "graphx")
解释奖励 + 资源链接,以了解有关 SBT 构建过程、jar 文件以及任何其他可以帮助我加快速度的信息!
【问题讨论】:
【参考方案1】:sbt-spark-package plugin 在provided
范围内提供依赖:
sparkComponentSet.map component =>
"org.apache.spark" %% s"spark-$component" % sparkVersion.value % "provided"
.toSeq
我们可以通过从 sbt 运行 show libraryDependencies
来确认这一点:
[info] * org.scala-lang:scala-library:2.11.12
[info] * org.apache.spark:spark-core:2.2.0:provided
[info] * org.apache.spark:spark-sql:2.2.0:provided
[info] * org.apache.spark:spark-graphx:2.2.0:provided
provided
范围意味着:
依赖项将是编译和测试的一部分,但不包括在 运行时。
因此sbt run
抛出java.lang.NoClassDefFoundError: org/apache/spark/SparkContext
如果我们真的想在 run
类路径上包含 provided
依赖项,那么 @douglaz 建议:
run in Compile := Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run)).evaluated
【讨论】:
非常明确的答案,谢谢。那么对于刚开始开发 Scala 项目的人来说,对于处理运行代码(基本模块测试)和交付最终项目的任务,您有什么建议?将 douglaz 的单行代码留在构建文件中是“好习惯”吗?以上是关于使用 sbt-spark-package 插件了解 build.sbt的主要内容,如果未能解决你的问题,请参考以下文章