如何使用spark-submit运行Scala脚本(类似于Python脚本)?

时间:2017-06-03 17:31:53

标签: scala apache-spark

我尝试使用Spark执行简单的Scala脚本,如Spark Quick Start Tutorial中所述。我没有麻烦执行以下Python代码:

"""SimpleApp.py"""
from pyspark import SparkContext

logFile = "tmp.txt"  # Should be some file on your system
sc = SparkContext("local", "Simple App")
logData = sc.textFile(logFile).cache()

numAs = logData.filter(lambda s: 'a' in s).count()
numBs = logData.filter(lambda s: 'b' in s).count()

print "Lines with a: %i, lines with b: %i" % (numAs, numBs)

我使用以下命令执行此代码:

/home/aaa/spark/spark-2.1.0-bin-hadoop2.7/bin/spark-submit hello_world.py

但是,如果我尝试使用Scala做同样的事情,我会遇到技术问题。更详细地说,我尝试执行的代码是:

* SimpleApp.scala */
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf

object SimpleApp {
  def main(args: Array[String]) {
    val logFile = "tmp.txt" // Should be some file on your system
    val conf = new SparkConf().setAppName("Simple Application")
    val sc = new SparkContext(conf)
    val logData = sc.textFile(logFile, 2).cache()
    val numAs = logData.filter(line => line.contains("a")).count()
    val numBs = logData.filter(line => line.contains("b")).count()
    println("Lines with a: %s, Lines with b: %s".format(numAs, numBs))
  }
}

我尝试以下列方式执行它:

/home/aaa/spark/spark-2.1.0-bin-hadoop2.7/bin/spark-submit hello_world.scala

结果我收到以下错误消息:

Error: Cannot load main class from JAR file

有人知道我做错了吗?

2 个答案:

答案 0 :(得分:7)

我想将@ JacekLaskowski添加到我有时用于POC或测试目的的替代解决方案中。

script.scala内的spark-shell:load一起使用。

:load /path/to/script.scala

您不需要定义SparkContext / SparkSession,因为脚本将使用REPL范围中定义的变量。

您也不需要将代码包装在Scala对象中。

PS:我认为这更像是一种黑客攻击而不是用于制作目的。

答案 1 :(得分:3)

使用spark-submit --help了解选项和参数。

$ ./bin/spark-submit --help
Usage: spark-submit [options] <app jar | python file> [app arguments]
Usage: spark-submit --kill [submission ID] --master [spark://...]
Usage: spark-submit --status [submission ID] --master [spark://...]
Usage: spark-submit run-example [options] example-class [example args]

正如您在第一次使用spark-submit中看到的那样,需要<app jar | python file>

app jar参数是Spark应用程序的jar,其中包含主对象(在您的情况下为SimpleApp)。

您可以使用sbt或maven构建应用程序jar,您可以在官方文档Self-Contained Applications中阅读:

  

假设我们希望使用Spark API编写一个自包含的应用程序。我们将在Scala(使用sbt),Java(使用Maven)和Python中使用简单的应用程序。

以及后面的部分:

  

我们可以创建一个包含应用程序代码的JAR包,然后使用spark-submit脚本来运行我们的程序。

P.S。使用Spark 2.1.1