我运行airflow scheduler
命令,它正在运行。但是,我无法设置气流调度程序服务。
以下是我的气流调度服务代码。
[Unit]
Description=Airflow scheduler daemon
After=network.target postgresql.service rabbitmq-server.service
Wants=postgresql.service rabbitmq-server.service
[Service]
EnvironmentFile=/home/ubuntu/airflow
User=ubuntu
Group=ubuntu
Type=simple
ExecStart=/bin/airflow scheduler -n ${SCHEDULER_RUNS}
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
但是,当我启动 airflow-scheduler 时,它没有运行。我收到以下错误:
May 25 21:11:37 ip-11-210-11-108 systemd[1]: airflow-scheduler.service: Service hold-off time over, scheduling restart.
May 25 21:11:37 ip-11-210-11-108 systemd[1]: Stopped Airflow scheduler daemon.
-- Subject: Unit airflow-scheduler.service has finished shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit airflow-scheduler.service has finished shutting down.
May 25 21:11:37 ip-11-210-11-108 systemd[1]: airflow-scheduler.service: Failed to load environment files: No such file or directory
May 25 21:11:37 ip-11-210-11-108 systemd[1]: airflow-scheduler.service: Failed to run 'start' task: No such file or directory
May 25 21:11:37 ip-11-210-11-108 systemd[1]: Failed to start Airflow scheduler daemon.
-- Subject: Unit airflow-scheduler.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit airflow-scheduler.service has failed.
--
-- The result is failed.
May 25 21:11:37 ip-11-210-11-108 systemd[1]: airflow-scheduler.service: Unit entered failed state.
May 25 21:11:37 ip-11-210-11-108 systemd[1]: airflow-scheduler.service: Failed with result 'resources'.
我没有使用过 systemd。SCHEDULER_RUNS 是什么?如何设置?
答案1
我知道我正在挖掘一篇过时的帖子,但我也想弄清楚为什么我无法让调度程序在服务器运行时自动运行。
我确实找到了一个适用于 Ubuntu 18.04 和 18.10 的解决方案
我提供了完整的说明如何安装 Airflow 和 PostgreSQL在链接的后端这里。
摘自我的文章后半部分:
本质上,它归结为对 airflow-scheduler.system 文件进行特定的更改。
这是在 Ubuntu 上实施的“陷阱”之一。创建 Airflow 的开发团队将其设计为在不同的 Linux 发行版上运行,因此需要进行一个小的(但关键的)更改,以便 Airflow 在服务器开启时自动运行。默认的 systemd 服务文件最初如下所示:
[Unit]
Description=Airflow scheduler daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service
Wants=postgresql.service mysql.service redis.service rabbitmq-server.service
[Service]
EnvironmentFile=/etc/sysconfig/airflow
User=airflow
Group=airflow
Type=simple
ExecStart=/bin/airflow scheduler
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
但是,这不起作用,因为“EnvironmentFile”协议在 Ubuntu 18 上不起作用。相反,注释掉该行并添加:
Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
您可能希望至少为 Airflow Scheduler 创建一个 systemd 服务文件,如果您希望 UI 也自动启动,那么可能还需要为 Webserver 创建一个 systemd 服务文件。事实上,我们确实希望在此实现中同时使用这两个文件,因此我们将创建两个文件,airflow-scheduler.service 和 airflow-webserver.service。这两个文件都将复制到 /etc/systemd/system 文件夹。如下所示:
airflow-scheduler.service
[Unit]
Description=Airflow scheduler daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service
Wants=postgresql.service mysql.service redis.service rabbitmq-server.service
[Service]
#EnvironmentFile=/etc/default/airflow
Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
User=airflow
Group=airflow
Type=simple
ExecStart=/home/ubuntu/anaconda3/envs/airflow/bin/airflow scheduler
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
#airflow-webserver.service
airflow-web服务器.service
[Unit]
Description=Airflow webserver daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service
Wants=postgresql.service mysql.service redis.service rabbitmq-server.service
[Service]
#EnvironmentFile=/etc/default/airflow
Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
User=airflow
Group=airflow
Type=simple
ExecStart=/home/ubuntu/anaconda3/envs/airflow/bin/airflow webserver -p 8085 --pid /home/ubuntu/airflow/airflow-webserver.pid
Restart=on-failure
RestartSec=5s
PrivateTmp=true
[Install]
WantedBy=multi-user.target
最后,通过超级用户复制命令 sudo cp 将这两个文件复制到 /etc/systemd/systemd 文件夹,就可以启动了:
sudo systemctl enable airflow-scheduler
sudo systemctl start airflow-scheduler
sudo systemctl enable airflow-webserver
sudo systemctl start airflow-webserver
答案2
在你的 systemd 文件中,有这样一行
EnvironmentFile=/home/ubuntu/airflow
它应该指向一个 EnvironmentFile,systemd 使用它来保存一些变量。看起来你让它指向 airflow 主目录。
它应该指向一个名为的文件airflow
,该文件里面应该有一个用于 SCHEDULER RUNS 的变量。请参阅此处的 airflow 文件:
https://github.com/apache/incubator-airflow/tree/master/scripts/systemd
您还遇到此错误:无法运行“启动”任务:没有此文件或目录
这与此行相关:
ExecStart=/bin/airflow scheduler -n ${SCHEDULER_RUNS}
该行表示运行/bin/airflow
,我假设它不存在于您的机器上。它可能在/usr/local/bin/airflow
或类似的地方。您可以运行which airflow
以查看您的实际安装位置。您可能能够为其添加符号链接,以便 /bin/airflow 指向您的实际位置,但无需过度复杂化,至少先让它工作。刚刚检查过,显然符号链接确实在 systemd 中起作用https://bugzilla.redhat.com/show_bug.cgi?id=955379