【问题标题】:Issues running airflow scheduler as a daemon process将气流调度程序作为守护进程运行的问题
【发布时间】:2018-03-10 14:47:42
【问题描述】:

我有一个使用 LocalExecutor 运行气流 1.8.0 的 EC2 实例。根据文档,我希望以下两个命令之一会在守护程序模式下引发调度程序:

airflow scheduler --daemon --num_runs=20

airflow scheduler --daemon=True --num_runs=5

但事实并非如此。第一个命令似乎可以工作,但它只是在返回终端之前返回以下输出,而不产生任何后台任务:

[2017-09-28 18:15:02,794] {__init__.py:57} INFO - Using executor LocalExecutor
[2017-09-28 18:15:03,064] {driver.py:120} INFO - Generating grammar tables from /usr/lib/python3.5/lib2to3/Grammar.txt
[2017-09-28 18:15:03,203] {driver.py:120} INFO - Generating grammar tables from /usr/lib/python3.5/lib2to3/PatternGrammar.txt

第二个命令产生错误:

airflow scheduler: error: argument -D/--daemon: ignored explicit argument 'True'

这很奇怪,因为根据docs --daemon=True 应该是airflow scheduler 调用的有效参数。

深入挖掘将我带到this StackOverflow post,其中一个回复建议根据this repo 提供的代码将气流调度程序作为后台进程处理systemd

我对脚本的轻微编辑改编发布为以下要点。我正在使用带有 Ubuntu 16.04.3 的 vanilla m4.xlarge EC2 实例:

从那里我打电话:

sudo systemctl enable airflow-scheduler
sudo systemctl start airflow-scheduler

然后什么也没有发生。虽然我在此实例上运行了更复杂的 DAG,但 I am using this dummy case 创建了一个简单的测试,该测试还用作侦听器,让我知道调度程序何时按计划运行。

我一直在使用journalctl -f 进行调试。以下是调度程序进程的几行输出。没有明显的问题,但我的任务没有执行,也没有为测试 DAG 生成日志,这将帮助我放大错误。问题出在哪里?

Sep 28 18:39:30 ip-172-31-15-209 airflow[20603]: [2017-09-28 18:39:30,965] {dag_processing.py:627} INFO - Started a process (PID: 21822) to generate tasks for /home/ubuntu/airflow/dags/scheduler_test_dag.py - logging into /home/ubuntu/airflow/logs/scheduler/2017-09-28/scheduler_test_dag.py.log
Sep 28 18:39:31 ip-172-31-15-209 airflow[20603]: [2017-09-28 18:39:31,016] {jobs.py:1002} INFO - No tasks to send to the executor
Sep 28 18:39:31 ip-172-31-15-209 airflow[20603]: [2017-09-28 18:39:31,020] {jobs.py:1440} INFO - Heartbeating the executor
Sep 28 18:39:32 ip-172-31-15-209 airflow[20603]: [2017-09-28 18:39:32,022] {jobs.py:1404} INFO - Heartbeating the process manager
Sep 28 18:39:32 ip-172-31-15-209 airflow[20603]: [2017-09-28 18:39:32,023] {jobs.py:1440} INFO - Heartbeating the executor
Sep 28 18:39:33 ip-172-31-15-209 airflow[20603]: [2017-09-28 18:39:33,024] {jobs.py:1404} INFO - Heartbeating the process manager
Sep 28 18:39:33 ip-172-31-15-209 airflow[20603]: [2017-09-28 18:39:33,025] {dag_processing.py:559} INFO - Processor for /home/ubuntu/airflow/dags/capone_dash_dag.py finished
Sep 28 18:39:33 ip-172-31-15-209 airflow[20603]: [2017-09-28 18:39:33,026] {dag_processing.py:559} INFO - Processor for /home/ubuntu/airflow/dags/scheduler_test_dag.py finished

当我手动运行airflow scheduler 时,一切正常。由于我的测试 DAG 的开始日期是 9 月 9 日,因此从那以后它每分钟都在回填,产生一个运行时间记录器。但是,当我使用systemd 将调度程序作为守护进程运行时,它完全安静,没有明显的错误来源。

有什么想法吗?

【问题讨论】:

    标签: python amazon-ec2 ubuntu-16.04 airflow apache-airflow


    【解决方案1】:

    文档可能已过时?

    我通常按以下方式启动 Airflow

    airflow kerberos -D
    airflow scheduler -D
    airflow webserver -D
    

    这是airflow webeserver --help 输出(从 1.8 版开始):

    -D, --daemon 守护进程而不是在前台运行

    注意那里不可能有布尔标志。必须修复文档。

    airflow scheduler -D 失败时的快速说明:

    这包含在 cmets 中,但这里似乎值得一提。当您运行气流调度程序时,它将创建文件$AIRFLOW_HOME/airflow-scheduler.pid。如果您尝试重新运行气流调度程序守护进程,这几乎肯定会生成文件$AIRFLOW_HOME/airflow-scheduler.err,它会告诉您lockfile.AlreadyLocked: /home/ubuntu/airflow/airflow-scheduler.pid is already locked。如果您的调度程序守护进程确实无法使用,并且您发现自己需要重新启动,请执行以下命令:

    sudo rm $AIRFLOW_HOME airflow-scheduler.err  airflow-scheduler.pid
    airflow scheduler -D 
    

    这让我的调度程序重回正轨。

    【讨论】:

    • 好建议,但这并不能解决问题。当我在没有 daemonize 标志的情况下手动运行 airflow scheduler 时,没有一个进程像它们那样运行。这还能是什么? which airflow 产生这个:/home/ubuntu/.local/bin/airflow
    • 我很想知道你在这里的经历。当我运行airflow scheduler -D 时,会弹出漂亮的气流打印,但随后我没有运行进程,而是返回到终端提示符。我没有在 PID 中给出指示调度程序在哪里运行,也没有我的任何进程正在执行。你会发生什么?
    • 如果它没有为你启动,检查 $AIRFLOW_HOME/airflow-scheduler.err - 它应该包含错误为什么它没有启动(可能是因为 pid 文件已经存在,或者它不能连接到后端数据库或其他东西)。是的,它打印气流横幅,然后在后台启动。如果您仍然无法使其运行,请尝试使用strace -f airflow scheduler -D 看看您是否能找出它失败的原因。
    • 工作得很好,谢谢。它已经顺利运行了几天:)
    • @Tagar - 日志去哪儿了?我试过你的方法,效果很好,但看不到我的工作日志。我正在使用多节点 Celery 执行器。当我只调用每个需要运行的进程时,它工作得很好。然而,对它们进行守护是一种痛苦,这似乎是一个很好的中间解决方案。我什至做了airflow worker -D >> /path/to/log/file.log &,虽然文件在那里,但它并没有显示我通常获得的正常信息深度。请帮忙!
    【解决方案2】:

    关于通过 systemd 启动任务:

    当以这种方式运行时,PATH 变量最初为空时出现问题。也就是说,当你写入文件/etc/sysconfig/airflow:

    PATH=/home/ubuntu/bin:/home/ubuntu/.local/bin:$PATH
    

    你真的写了:

    PATH=/home/ubuntu/bin:/home/ubuntu/.local/bin
    

    因此,变量PATH 不包含/bin,这是LocalExecutor 用来运行任务的bash 实用程序。

    所以我不明白为什么在这个文件中你没有指定AIRFLOW_HOME。也就是说,Airflow 正在查找其配置文件的目录。

    【讨论】:

    • 我还没有机会尝试这个,但一旦我能够试一试,我会尽快回复您。如果它解决了问题,我一定会选择你的答案。
    • Tagar 的回答是解决此问题的更简单方法。不过还是谢谢你的建议!
    猜你喜欢
    • 2017-01-15
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2013-09-14
    • 2012-12-03
    • 2011-08-25
    相关资源
    最近更新 更多