运行 v1 与 v2 的 Spark 应用程序

Running Spark App for v1 vs v2

我正在尝试从设置我的 Spark 应用程序,从使用 Spark v1 到 v2。在 v1 中,我会使用 Spark Context 和 Spark Config 来初始化。但是,根据 Spark v2 的最新文档(快速入门指南)我应该使用 Spark Session 并且建议使用 spark-submit 从 cmd 传递配置(我所提到的所有内容都显示在本页底部附近: https://spark.apache.org/docs/latest/quick-start.html).

下面是我的应用程序,Spark Session 内容 (v2) 已被注释掉,展示了我如何 运行 v1 的内容。如果我 运行 这样,我会得到错误 'failed to initialize Spark Context'。然后,如果我通过将应用程序打包为 JAR 并在 cmd 中使用 spark-submit 来重新安排我对 Spark Session (v2) 的 运行 事物的评论,并 运行 它(按照与已经相同的指南上面引用),我得到错误:"Cannot load main class from JAR file:/C:/"

我正在更改我的 SPARK_HOME 变量以指向正确的版本,并且我正在更改为构建文件中的适当版本。

这是应用:

import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.sql.SparkSession

object Pack {
  def main(args: Array[String]) {

  val conf = new SparkConf().setMaster("local[*]").setAppName("Pack")
  .set("spark.executor.memory", "2g")
  val sc = new SparkContext(conf)

  /* val spark = SparkSession.builder.appName("PackTest").getOrCreate() */

  val logFile = "C:/Spark/spark-2.2.0-bin-hadoop2.7/bin/README.md"

  val logData = sc.textFile(logFile).cache()
  /*  val logData = spark.read.textFile(logFile).cache()  */

  val numAs = logData.filter(line => line.contains("a")).count()
  val numBs = logData.filter(line => line.contains("b")).count()
  println(s"Lines with a: $numAs, Lines with b: $numBs")

  /* spark.stop() */
  }
 }

这是 sbt 构建文件:

name := "Pack"

version := "1.0"

scalaVersion := "2.11.8"

libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.1" /* 2.2.0 
when trying sparksession */

libraryDependencies += "org.apache.spark" %% "spark-sql" % "1.6.1" /* 2.2.0 
when trying sparksession */

好的,解决了。我的评论中已经提到了 v1 的解决方案。

对于 v2,我完全按照快速入门指南进行操作,除了这一点: 归结为将 class 移动到名为 'scala' 而不是 'scala-2.11' (Intellij) 的 src 文件夹中。 我也 运行 重建,但不知道这是否有效果。

看似微不足道,但解决了问题。