我想在启动后使用以下命令启动Apache Spark集群:

sudo ./path/to/spark/sbin/start-all.sh


然后在系统准备重新启动/关闭时运行此命令:

sudo ./path/to/spark/sbin/stop-all.sh


我如何开始?我有可以建立的基本模板吗?

我尝试使用一个非常简单的文件(文件:/lib/systemd/system/spark.service):

[Unit]
Description=Spark service

[Service]
ExecStart=sudo ./path/to/spark/sbin/start-all.sh


哪个不起作用。

评论

看看:wiki.ubuntu.com/SystemdForUpstartUsers

@WillemK,您好,我已经查看了此页面。我发现的问题是我不能只用ExecStart =替换exec。另外,我以前从未用过新贵。

脚本路径前的点看起来非常可疑。

@AndreaLazzarotto我认为OP试图以OP在终端中的方式运行脚本,因此....

@AndreaLazzarotto,您好,这是正确的。抱歉造成任何混乱。

#1 楼

您的.service文件应如下所示:

[Unit]
Description=Spark service

[Service]
ExecStart=/path/to/spark/sbin/start-all.sh

[Install]
WantedBy=multi-user.target


现在,采取一些其他步骤来启用和使用.service文件:


将其放在/etc/systemd/system文件夹中,并命名为myfirst.service

确保脚本可执行文件包含:

chmod u+x /path/to/spark/sbin/start-all.sh



启动它:

sudo systemctl start myfirst



使其在启动时运行:

sudo systemctl enable myfirst



停止:

sudo systemctl stop myfirst



注意事项


您无需在sudo中启动Spark您的服务,因为默认服务用户已经是root用户。
请查看下面的链接以获取更多systemd选项。

此外,

现在我们所拥有的仅仅是基本,这里是spark的完整设置:

[Unit]
Description=Apache Spark Master and Slave Servers
After=network.target
After=systemd-user-sessions.service
After=network-online.target

[Service]
User=spark
Type=forking
ExecStart=/opt/spark-1.6.1-bin-hadoop2.6/sbin/start-all.sh
ExecStop=/opt/spark-1.6.1-bin-hadoop2.6/sbin/stop-all.sh
TimeoutSec=30
Restart=on-failure
RestartSec=30
StartLimitInterval=350
StartLimitBurst=10

[Install]
WantedBy=multi-user.target


要设置服务:

sudo systemctl start spark.service
sudo systemctl stop spark.service
sudo systemctl enable spark.service


进一步阅读

请通读以下链接。 Spark是一个复杂的设置,因此您应该了解它如何与Ubuntu的init服务集成。


https://datasciencenovice.wordpress.com/2016/11/30/spark-stand- alone-cluster-as-a-systemd-service-ubuntu-16-04centos-7 /
https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files
https://www.freedesktop.org/software/systemd/man/systemd.unit.html


评论


注意并更新

–乔治·乌多森
17年5月26日在9:16

谢谢您,我根据您的建议创建了一个文件。在运行sudo systemctl start spark时,收到以下错误:无法启动spark.service:未正确加载单元spark.service:参数无效。有关详细信息,请参见系统日志和“ systemctl status spark.service”。

– Macourtney7
17年5月26日在10:24

systemctl状态spark.service的主要部分如下:可执行路径不是绝对路径,而spark.service:服务缺少ExecStart =和ExecStop =设置。拒绝。

– Macourtney7
17年5月26日在10:27

问题是:1)需要Spark二进制路径(应替换服务文件中的二进制路径); 2)Spark具有关闭命令是什么。 3)您是否浏览了我给您的链接。我不使用火花,所以供应它们

–乔治·乌多森
17年5月26日在11:05

@GeorgeUdosen感谢您的回答,我的问题是重启后如何在特定命令下运行spark?问题在这里askubuntu.com/questions/979498/…

– Soheil Pourbafrani
17年12月13日在6:21



#2 楼

将其复制粘贴到终端(作为根用户)中,以创建/root/boot.sh并在启动时运行它:

bootscript=/root/boot.sh
servicename=customboot

cat > $bootscript <<EOF
#!/usr/bin/env bash
echo "$bootscript ran at $(date)!" > /tmp/it-works
EOF

chmod +x $bootscript

cat > /etc/systemd/system/$servicename.service <<EOF
[Service]
ExecStart=$bootscript
[Install]
WantedBy=default.target
EOF

systemctl enable $servicename


要修改参数,例如使用其他$bootscript,只需手动设置该变量,然后在复制命令时跳过该行。

运行命令后,您可以使用自己喜欢的编辑器编辑/root/boot.sh,它将在下次启动时运行。您还可以使用以下命令立即运行它:

systemctl start $servicename


评论


我对systemd文档有些困惑,但不应将它设为Type = oneshot RemainAfterExit = yes,否则除非自定义脚本使某些进程处于运行状态,否则systemd会认为该任务处于非活动状态。

– Peter Lamberg
19年7月27日在14:38

@PeterLamberg我也尝试阅读systemd文档,但我们俩都是;)。我记得它们不是很清楚,但是我发布的答案在多个系统上都对我有效(我不时重新访问此页面)。您是说,因为它被认为是“非活动”的,所以每个后续的“开始”调用都会重新运行脚本?因为我会认为这是shell脚本所期望的。如果在重新启动之前不得不“停止”一些实际上未运行的程序,我会觉得很奇怪。

–吕克
19年7月27日在18:53