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

Rom*_*man 9 scala apache-spark

我尝试使用Spark执行简单的Scala脚本,如Spark快速入门教程中所述.我没有麻烦执行以下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)
Run Code Online (Sandbox Code Playgroud)

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

/home/aaa/spark/spark-2.1.0-bin-hadoop2.7/bin/spark-submit hello_world.py
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使用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))
  }
}
Run Code Online (Sandbox Code Playgroud)

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

/home/aaa/spark/spark-2.1.0-bin-hadoop2.7/bin/spark-submit hello_world.scala
Run Code Online (Sandbox Code Playgroud)

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

Error: Cannot load main class from JAR file
Run Code Online (Sandbox Code Playgroud)

有谁知道我做错了什么?

eli*_*sah 7

我想添加@ JacekLaskowski是我有时用于POC或测试目的的替代解决方案.

这将是使用script.scala内部的spark-shellwith :load.

:load /path/to/script.scala
Run Code Online (Sandbox Code Playgroud)

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

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

PS:我认为这更像是一个黑客,而不是用于生产目的.

  • 同样,spark-shell 可以采用“-i file.scala”参数,其中 file.scala 内容在 REPL 中被评估,就像键入或 :loaded 然后 REPL 退出。 (2认同)
  • 虽然我同意这种风格绝对不能用于生产应用,但这是一种快速原型的绝佳方式,因此在推广"黑客"的基础上省略一个有效的策略,假设它们会形成坏习惯,这是不诚实的. (2认同)

Jac*_*ski 5

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

\n\n
$ ./bin/spark-submit --help\nUsage: spark-submit [options] <app jar | python file> [app arguments]\nUsage: spark-submit --kill [submission ID] --master [spark://...]\nUsage: spark-submit --status [submission ID] --master [spark://...]\nUsage: spark-submit run-example [options] example-class [example args]\n
Run Code Online (Sandbox Code Playgroud)\n\n

正如您在第一个用法spark-submit要求中所看到的<app jar | python file>

\n\n

参数app jar是 Spark 应用程序的 jar 与主对象(SimpleApp在您的情况下)。

\n\n

您可以使用 sbt 或 maven 构建应用程序 jar,您可以在官方文档的独立应用程序中阅读:

\n\n
\n

假设我们希望使用 Spark API 编写一个独立的应用程序。我们将演示一个使用 Scala(使用 sbt)、Java(使用 Maven)和 Python 编写的简单应用程序。

\n
\n\n

以及本节后面的内容:

\n\n
\n

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

\n
\n\n
\n\n

ps 使用Spark 2.1.1

\n