使用 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的主要内容,如果未能解决你的问题,请参考以下文章

jQuery.cookie.js插件了解及使用方法

vue尚品汇商城项目-day07vue插件-49.(了解)自定义插件

了解Lombok插件

macOS: 使用 knockknock 了解当前运行状况和安装插件和扩展,以方便排查可能的问题

macOS: 使用 knockknock 了解当前运行状况和安装插件和扩展,以方便排查可能的问题

macOS: 使用 knockknock 了解当前运行状况和安装插件和扩展,以方便排查可能的问题