我有一个 scala 脚本文件,它通过交互式 Spark-shell 以经典方式成功执行:输入 Spark-shell,粘贴脚本,等待完成。
我希望能够让这个东西继续工作并退出 ssh 会话,在需要时返回结果。
我尝试过这个,但它的行为很奇怪
spark-shell -i file.scala >> out.log 2>&1 &
它仅将几行常见的 Spark 输出打印到 out.log,然后报告进程已结束。当我做 'ps aux | 时grep Spark' 我看到进程之间有 Spark 正在运行。
当我运行它时,它的行为符合预期,但我必须保持会话打开才能得到结果。
spark-shell -i file.scala
有没有办法让spark-shell与nohup正常工作?
我知道 Spark-Submit 可以与 jar 一起使用,但感觉不太直观,对于一个简单的测试,我必须组装一个 jar 并执行 Maven 魔法。
我遇到了
spark-shell
与 nohup
相同的行为。其背后的原因尚不清楚,但可以使用 tmux
代替 nohup
作为解决方法。关于如何使用tmux
的非常好的指南可以在这里找到。
可能的操作如下:
$ tmux new -s session-name
$ ./bin/spark-shell
# do usual stuff manually
然后,如果您关闭终端窗口并退出 ssh 会话,您可以像这样重新进入
tmux
会话:
$ tmux attach -t session-name
我使用shell脚本来执行
spark-shell
,在my-script.sh
里面:
$SPARK_HOME/bin/spark-shell < $HOME/test.scala > $HOME/test.log 2>&1 &
通过谷歌搜索在某个地方阅读它并尝试一下。它正在为我服务。
如果您尝试在
aws-cli
上执行它,那么您可以使用以下命令..
nohup bash -c "YOUR_COMMAND 2>&1 &"
因此要执行spark-shell
nohup bash -c "spark-shell -i file.scala >> out.log 2>&1 &"
我参加聚会有点晚了,但我最近发现了另一个解决方案:
echo ":load myscript.scala" | nohup $SPARK_HOME/bin/spark-shell [other args]
其他参数代表传递给spark-shell的更多参数(而不是你的脚本;我还没有测试该部分)。我在脚本末尾有一个 df.write() 调用,因此结果被保存到 HDFS - 不需要将它们打印在屏幕上。请注意,我不需要在命令末尾添加 &。
我尝试关闭 SSH 连接,并且 Spark-shell 作业根据 Spark UI 继续运行任务:-)
nohup
命令吗?
仅使用
&
将进程置于后台并不会阻止进程在收到 SIGHUP 信号时退出,这是进程在您注销时收到的信号。
试试这个:
nohup spark-shell -i file.scala >> out.log &
如果您想在 aws bash / ec2/ emr 中以客户端模式执行 nohup bash -c“spark-shell --deploy-mode client -i your_script.scala >> out.log 2>&1 &”