Понимание build.sbt с помощью плагина sbt-spark-package - PullRequest
0 голосов
/ 21 февраля 2019

Я новенький файлы сборки scala и SBT.Из вводных руководств добавление спарк-зависимостей в проект 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 - РАБОТАЕТ.Почему библиотекаDependencies запускается / работает?

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 Ответ

0 голосов
/ 21 февраля 2019

плагин sbt-spark-package предоставляет зависимости в provided scope:

sparkComponentSet.map { component =>
  "org.apache.spark" %% s"spark-$component" % sparkVersion.value % "provided"
}.toSeq

Мы можем подтвердить это, запустив show libraryDependencies из sbt:

[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 throws java.lang.NoClassDefFoundError: org/apache/spark/SparkContext

Если мы действительно хотим включить provided зависимости от run classpath, тогда @ douglaz предлагает:

run in Compile := Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run)).evaluated
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...