4

需要通过 spark-shell 以静默模式执行 scala 脚本。当我使用时spark-shell -i "file.scala",执行后,我进入了 scala 交互模式。我不想进入那里。

我试图执行 spark-shell -i "file.scala"。但我不知道如何在静默模式下执行脚本。

spark-shell -i "file.scala"

执行后,我进入

scala>

我不想进入scala>模式

更新(2019 年 10 月)终止的脚本

这个问题也是关于运行终止的脚本,即spark-shell -i script.scala > output.txt由您自己停止运行的“scala脚本”(内部指令System.exit(0)终止脚本)。用一个很好的例子来
看看这个问题。

它还需要一个“静音模式”预计不会污染output.txt

假设Spark v2.2+


PS:在很多情况下(通常是小工具和模块/算法测试),Spark 解释器可以比编译器更好......请,“让我们编译吧!” 这里不是答案。

4

3 回答 3

4

spark-shell -i file.scala最后保持解释器打开,因此System.exit(0)需要在脚本的末尾。最合适的解决方案是将代码放入try {}并放入System.exit(0)部分finally {}

如果需要日志记录,您可以使用以下内容:

spark-shell < file.scala > test.log 2>&1 &

如果您对编辑文件有限制并且无法添加System.exit(0),请使用:

echo :quit | scala-shell -i file.scala

UPD

如果要抑制输出中除 printlns 之外的所有内容,则必须关闭 spark-shell 的日志记录。配置示例在这里。禁用任何类型的登录$SPARK-HOME/conf/log4j.properties应该只允许您看到 pritnlns。但我不会在 printlns 中采用这种方法。应使用带有 log4j 的通用日志记录而不是 printlns。您可以对其进行配置,以便获得与 printlns 相同的结果。它归结为配置模式。此答案提供了解决您的问题的模式示例。

于 2019-10-31T13:54:06.753 回答
0

最好的方法是明确地将你的 scala 代码编译到一个 jar 中并使用spark-submit,但如果你只是在寻找一个快速的迭代循环,你可以:quit在解析你的 scala 代码后简单地发出:

echo :quit | scala-shell -i yourfile.scala
于 2019-08-28T08:32:17.653 回答
0

添加到@rluta的答案。您可以将spark-shell命令调用放在 shell 脚本中。在 shell 脚本中说以下内容:

spark-shell < yourfile.scala

但这需要您将代码行保留在一行内,以防语句写在不同的行上。

或者

echo :quit | spark-shell -i yourfile.scala

这应该

于 2019-10-31T11:14:50.783 回答