我正在为我的数据管道项目使用气流。我已经在气流中配置了我的项目,并使用以下命令将气流服务器作为后端进程启动
airflow webserver -p 8080 -D True
服务器在后端成功运行。现在我想在气流中启用身份验证并在气流.cfg 中完成配置更改,但身份验证功能未反映在服务器中。当我在本地机器上停止并启动气流服务器时,它可以工作。
那么如何在我的服务器中重新启动我的守护进程气流网络服务器进程?
我正在为我的数据管道项目使用气流。我已经在气流中配置了我的项目,并使用以下命令将气流服务器作为后端进程启动
airflow webserver -p 8080 -D True
服务器在后端成功运行。现在我想在气流中启用身份验证并在气流.cfg 中完成配置更改,但身份验证功能未反映在服务器中。当我在本地机器上停止并启动气流服务器时,它可以工作。
那么如何在我的服务器中重新启动我的守护进程气流网络服务器进程?
我建议以稳健的方式运行气流,使用 systemd 自动恢复,
这样您就可以:
- 开始systemctl start airflow
- 停止systemctl stop airflow
- 重新启动systemctl restart airflow
为此,您需要一个 systemd 'unit' 文件。作为(工作)示例,您可以使用以下内容:
put it in /lib/systemd/system/airflow.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]
PIDFile=/run/airflow/webserver.pid
EnvironmentFile=/home/airflow/airflow.env
User=airflow
Group=airflow
Type=simple
ExecStart=/bin/bash -c 'export AIRFLOW_HOME=/home/airflow ; airflow webserver --pid /run/airflow/webserver.pid'
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure
RestartSec=42s
PrivateTmp=true
[Install]
WantedBy=multi-user.target
PS:使用配置将 AIRFLOW_HOME 更改为您的气流文件夹
你能检查$AIRFLOW_HOME/airflow-webserver.pid
你的网络服务器守护进程的进程ID吗?
然后给它传递一个kill信号来杀死它
cat $AIRFLOW_HOME/airflow-webserver.pid | xargs kill -9
然后清除pid文件
cat /dev/null > $AIRFLOW_HOME/airflow-webserver.pid
然后运行
airflow webserver -p 8080 -D True
重新启动守护程序。
这对我有用(多次!:D)
查找进程ID:(假设8080是端口)
lsof -i tcp:8080
杀了它
kill <pid>
Airflow 使用gunicorn作为 HTTP 服务器,因此您可以向其发送标准 POSIX 样式的信号。守护进程常用的重启信号是HUP
.
您需要找到气流网络服务器守护进程的 pid 文件,以便获得正确的进程 ID 来发送信号。该文件可能位于$AIRFLOW_HOME
或/var/run
中,您可以在其中找到很多 pid。
假设 pid 文件位于 中/var/run
,您可以运行以下命令:
cat /var/run/airflow-webserver.pid | xargs kill -HUP
gunicorn 使用预分叉模型,因此它具有主进程和工作进程。HUP
信号被发送到主进程,主进程执行以下操作:
HUP:重新加载配置,使用新配置启动新的工作进程并优雅地关闭旧工作进程。如果应用程序没有预加载(使用 preload_app 选项),Gunicorn 也会加载它的新版本。
gunicorn 信号处理文档中的更多信息。
这主要是captaincapsaicin答案的扩展版本,但是使用HUP
(SIGHUP)而不是KILL
(SIGKILL)来重新加载进程,而不是实际杀死它并重新启动它。
就我而言,我想终止以前的气流过程并开始。因为下面的命令做了魔法
killall -9 airflow
由于问题与 相关webserver
,这在我的情况下是有效的:
systemctl restart airflow-webserver
赶紧跑:
airflow webserver -p 8080 -D
查找pid
:
airflow webserver
将给出:“网络服务器已经在 PID 21250下运行。”
比杀死 Web 服务器进程:
kill 21250
创建一个初始化脚本并使用命令“daemon”将其作为服务运行。
daemon --user="${USER}" --pidfile="${PID_FILE}" airflow webserver -p 8090 >> "${LOG_FILE}" 2>&1 &
推荐的方法是创建和启用气流网络服务器作为服务。如果您将网络服务器命名为“airflow-webserver”,请运行以下命令重新启动服务:
systemctl 重启气流网络服务器
您可以使用来自 AWS Marketplace 的现成 AMI(即 LightningFLow),它提供在启动时启用的 Airflow 服务(网络服务器、调度程序、工作程序)。
注意:LightningFlow 预集成了所有必需的库、Livy、自定义运算符和本地 Spark 集群。
AWS Marketplace 的链接:https ://aws.amazon.com/marketplace/pp/Lightning-Analytics-Inc-LightningFlow-Integrated-o/B084BSD66V
这些都不适合我。我不得不删除$AIRFLOW_HOME/airflow-webserver.pid
文件,然后运行airflow webserver
工作。