【问题标题】:How do I restart airflow webserver?如何重新启动气流网络服务器?
【发布时间】:2016-12-28 15:29:27
【问题描述】:

我正在为我的数据管道项目使用气流。我已经在气流中配置了我的项目,并使用以下命令将气流服务器作为后端进程启动

airflow webserver -p 8080 -D True

服务器在后端成功运行。现在我想在气流中启用身份验证并在气流.cfg 中完成配置更改,但身份验证功能未反映在服务器中。当我在本地机器上停止并启动气流服务器时,它可以工作。

那么如何在我的服务器中重新启动我的守护进程气流网络服务器进程?

【问题讨论】:

  • 气流网络服务器 -p 8080 -D

标签: python-2.7 airflow


【解决方案1】:

您能否检查$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 之后需要True
  • 你是对的。只要你传递标志你不需要显式传递True
  • 这似乎不适用于我。当我使用 cat 时我仍然可以看到 pid 我正在使用 WSL 2 btw
  • @captaincapsaicin:我已批准对此答案的编辑。请仔细检查以确保它符合您的预期。
【解决方案2】:

通过以下方式查找pid

airflow webserver

将给出:“网络服务器已经在 PID 21250 下运行。”

比杀死网络服务器进程:

kill 21250

【讨论】:

    【解决方案3】:

    就我而言,我想终止之前的气流过程并开始。 因为下面的命令做了魔法

    killall -9 airflow
    

    【讨论】:

    • 是的!我在没有运行服务的情况下错误地启动了网络服务器,这正是我想要的
    【解决方案4】:

    由于这个问题与webserver 有关,这对我来说是可行的:

    systemctl restart airflow-webserver

    【讨论】:

      【解决方案5】:

      推荐的方法是创建和启用气流网络服务器作为服务。如果您将网络服务器命名为“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

      【讨论】:

        【解决方案6】:

        只要运行:

        airflow webserver -p 8080 -D 
        

        【讨论】:

          【解决方案7】:

          创建一个初始化脚本并使用命令“daemon”将其作为服务运行。

          daemon --user="${USER}" --pidfile="${PID_FILE}" airflow webserver -p 8090 >> "${LOG_FILE}" 2>&1 &
          

          【讨论】:

            【解决方案8】:

            这些都不适合我。我不得不删除$AIRFLOW_HOME/airflow-webserver.pid 文件,然后运行airflow webserver 工作。

            【讨论】:

            • 当 pid 文件仍然存在时,气流阻止在守护程序模式下运行。
            【解决方案9】:

            我建议以稳健的方式运行气流,并使用 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
            

            P.S:将 AIRFLOW_HOME 更改为您的气流文件夹与配置

            【讨论】:

            • 这是正确的做法。 upstart 和 systemd 都有示例脚本:github.com/apache/incubator-airflow/tree/master/scripts
            • 这也在气流文档中讨论:pythonhosted.org/airflow/…
            • 如果您熟悉守护程序化气流,您和/或@7yl4r 可以帮帮我吗?我在从 virtualenv 中守护它时遇到了麻烦。谢谢!
            • 我在尝试您的解决方案时收到此错误“airflow.service 的作业失败,因为超出了配置的资源限制。有关详细信息,请参阅“systemctl status airflow.service”和“journalctl -xe”“
            • 这里只是一个问题,假设我们在虚拟环境中有 apache-airflow,您是否必须激活环境或者有没有办法使用 bin 文件夹中存在的文件执行气流 webserver 命令我们的虚拟环境
            【解决方案10】:

            这对我有用(多次!:D)

            找到进程id:(假设8080是端口)

            lsof -i tcp:8080
            

            杀了它

            kill <pid>
            

            【讨论】:

              【解决方案11】:

              使用 Airflow 网络服务器的 (gunicorn) 信号处理

              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 signal handling docs

              这主要是 Captaincapsaicin 答案的扩展版本,但使用 HUP (SIGHUP) 而不是 KILL (SIGKILL) 来重新加载进程,而不是实际杀死它并重新启动它。

              【讨论】:

              • 谢谢,这对我在开发 Airflow 插件时非常有用!我在修改文件时将它与entr 一起使用以自动重新加载:git ls-files | entr sh -c 'cat $AIRFLOW_HOME/airflow-webserver.pid | xargs -t kill -HUP'
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-03-06
              • 1970-01-01
              • 2021-07-15
              • 2018-09-24
              • 2017-04-22
              • 2018-06-09
              • 2019-09-07
              相关资源
              最近更新 更多