是否可以在不进入 spark-shell 的情况下 运行 Spark Scala 脚本?

Is it possible to run a Spark Scala script without going inside spark-shell?

我知道 运行 基于 Scala 的 spark 代码的唯一两种方法是将 Scala 程序编译成 jar 文件并 运行 使用 spark-submit,或者 运行在 spark-shell 中使用 :load 的 Scala 脚本。我的问题是,可以直接在命令行上 运行 Scala 文件,而无需先进入 spark-shell 然后发出 :load?

可以通过 spark-submit 实现。

https://spark.apache.org/docs/latest/submitting-applications.html

你甚至可以把它放到 bash 脚本中或者创建 sbt-task https://www.scala-sbt.org/1.x/docs/Tasks.html 运行 你的代码。

您可以简单地使用标准输入重定向 spark-shell:

spark-shell < YourSparkCode.scala

此命令启动一个 spark-shell,逐行解释您的 YourSparkCode.scala 并在最后退出。

另一种选择是使用 spark-shell 命令的 -I <file> 选项:

spark-shell -I YourSparkCode.scala

唯一的区别是后一个命令将您留在 shell 中,您必须发出 :quit 命令才能关闭会话。

[UDP] 传递参数

由于 spark-shell 不会将您的源代码作为应用程序执行,而只是逐行解释您的源文件,因此您不能将任何参数直接作为应用程序参数传递。

幸运的是,可能有很多方法可以实现相同的方法(例如,将参数外部化到另一个文件中并在脚本的开头读取它)。

但我个人认为 Spark 配置是最简洁方便的方式。

您通过 --conf 选项传递参数:

spark-shell --conf spark.myscript.arg1=val1 --conf spark.yourspace.arg2=val2 < YourSparkCode.scala

(请注意,您的 属性 名称中的 spark. 前缀是强制性的,否则 Spark 会将您的 属性 视为无效而丢弃)

并在您的 Spark 代码中读取这些参数,如下所示:

val arg1: String = spark.conf.get("spark.myscript.arg1")
val arg2: String = spark.conf.get("spark.myscript.arg2")