气流随机不运行排队任务某些任务甚至没有排队状态。我在调度程序日志中一直看到
[2018-02-28 02:24:58,780] {jobs.py:1077} INFO - No tasks to consider for execution.
我确实看到数据库中的任务没有状态或排队状态,但它们永远不会开始。
使用Redis在ECS上运行气流设置为https://github.com/puckel/docker-airflow。有4个调度程序线程和4个Celery工作程序任务。当鼠标悬停在任务图标上时,未运行的任务显示在排队状态(灰色图标)操作符为空且任务详细信息显示为:
All dependencies are met but the task instance is not running. In most cases this just means that the task will probably be scheduled soon unless:- The scheduler is down or under heavy load
调度程序上的度量标准不会显示负载。 dag非常简单,2个独立任务仅取决于最后一次运行。同一个dag中的任务也没有状态(白色图标)。
有趣的是,当我重新启动调度程序时,任务更改为运行状态。
答案 0 :(得分:29)
设置Airflow可能有点棘手。
airflow scheduler
正在运行吗?airflow webserver
在跑吗? 例如,我有一个错误设置为depends_on_past: True
的DAG,禁止当前实例正确启动。
直接在文档中提供了一个很好的资源,它还有一些提示:Why isn't my task getting scheduled?。
答案 1 :(得分:7)
我也在运行puckel / docker-airflow repo的一个分支,主要在Airflow 1.8上运行大约一年的10M +任务实例。我认为这个问题在1.9中仍然存在,但我并不乐观。
无论出于何种原因,Airflow调度程序似乎存在一个长期存在的问题,即性能会随着时间的推移而降低。我已经查看了调度程序代码,但是我仍然不清楚在重新启动时会有什么不同之处,以便重新启动调度程序。一个主要区别是重建了计划任务状态和排队任务状态。
Airflow wiki中的Scheduler Basics提供了关于调度程序如何工作及其各种状态的简明参考。
大多数人通过定期重新启动调度程序来解决调度程序,从而减少吞吐量问题。我个人间隔1小时就找到了成功,但每隔5-10分钟也经常看到。在尝试重启间隔时,您的任务量,任务持续时间和并行度设置值得考虑。
有关详细信息,请参阅:
过去通过使用SCHEDULER_RUNS
config setting重新启动每次X次运行来解决此问题,尽管该设置是默认systemd脚本中的recently removed。
您也可以考虑发布到Airflow dev mailing list。我知道这已经在那里讨论了几次,其中一个核心贡献者可能能够提供额外的背景。
相关问题
答案 2 :(得分:2)
datetime.now()
作为开始日期直觉认为,如果您告诉DAG开始“现在”,它将执行“现在”。但是,这并未考虑Airflow本身实际如何读取datetime.now()
。
要执行DAG,start_date必须是过去的时间,否则Airflow会认为尚未准备好执行。当Airflow评估您的DAG文件时,它会将datetime.now()
解释为当前时间戳(即不是过去的时间),并确定它尚未准备好运行。由于每次Airflow心跳(评估您的DAG)每5-10秒就会发生一次,因此它将永远不会运行。
要正确触发DAG运行,请确保插入过去的固定时间(例如datetime(2019,1,1))并设置catchup = False(除非您希望运行回填)。 / p>
这意味着在开始日期之后一个schedule_interval。例如,每小时DAG将在时钟为下午3点时执行其下午2点运行。这样做的原因是,Airflow不能确保在该小时间隔结束之前,存在与2pm间隔相对应的所有数据。
这是Airflow的一个特殊方面,但要记住一个重要方面-特别是在使用默认变量和宏的情况下。
鉴于您的其余数据库和API最有可能也遵循这种格式,因此这不足为奇,但是值得澄清。
全文和来源here
答案 3 :(得分:1)
我今天面对这个问题,发现下面的 tobi6 答案中的要点4解决了问题
*'Do all the DAGs you want to run have a start date which is in the past?'*
我正在使用气流版本v1.10.3
答案 4 :(得分:1)
我的问题又往上走了一步,除了我的任务正在排队,我在Flower UI上看不到我的任何芹菜工人。解决方案是,由于我以根用户身份运行celery worker,因此必须在〜/ .bashrc文件中进行更改。
以下步骤使其有效:
通过以下网址检查您的Flower UI:http:// {HOST}:5555
答案 5 :(得分:1)
您可以尝试停止Web服务器和调度程序:
ps -ef | grep airflow #show the process id
kill 1234 #kill the webserver
kill 5678 #kill the scheduler
从airflow文件夹中删除文件(如果存在)(它们将再次创建):
airflow-scheduler.err
airflow-scheduler.pid
airflow-webserver.err
airflow-webserver.pid
再次启动Web服务器和调度程序。
airflow webserver -D
airflow scheduler -D
-D将使服务在后台运行。
答案 6 :(得分:0)
要检查的另一件事是“是否达到了DAG的并发参数?” 。
当某些任务显示为无状态时,我也遇到了同样的情况。
原来,我的File_Sensor任务是在超时设置为1周的情况下运行的,而DAG超时仅为5小时。这导致文件丢失的情况,许多任务传感器同时运行。导致并发超载!
依赖任务无法在传感器任务成功之前启动,当dag超时时,它们变为无状态。
我的解决方案:
请参考文档。 https://airflow.apache.org/faq.html#why-isn-t-my-task-getting-scheduled
答案 7 :(得分:0)
我也遇到了类似的问题,但主要与SubDagOperator有关,总共有3000多个任务实例(30个任务* 44个subdag任务)。
我发现,airflow scheduler
主要负责将计划的任务放入“排队的插槽”(池),而airflow celery workers
是负责将排队的任务放入其中的人“已用插槽”(池)并运行它。
根据您的描述,您的scheduler
应该可以正常工作。建议您检查“芹菜工人”日志以查看是否存在任何错误,或者重新启动它以查看是否有帮助。我遇到了一些问题,通常芹菜工人会罢工几分钟,然后重新开始工作(尤其是在SubDagOperator上)
答案 8 :(得分:0)
我认为这是celery 4.2.1和redis 3.0.1的问题,如下所述:
https://github.com/celery/celery/issues/3808
我们通过降级Redis版本2.10.6解决了该问题:
redis==2.10.6
答案 9 :(得分:0)
我认为值得一提的是,有一个公开的问题可能导致任务在没有明显原因的情况下无法运行:https://issues.apache.org/jira/browse/AIRFLOW-5506
使用LocalScheduler连接到PostgreSQL气流数据库时,似乎会出现此问题,并导致调度程序记录了许多“杀死PID xxxx”行。在DAG停止后,请检查调度程序日志,并且暂时不启动任何新任务。
答案 10 :(得分:0)
在我的情况下,没有启动任务,因为我为所有操作员配置了一个池,但尚未创建它,因此甚至没有安排任务。运算符如下:
<?php
if($checkGallery):
?>
<td><?= This post has a gallery! ?></td>
<?php else: ?>
<td><?= No gallery attached to this post.?></td>
<?php endif;?>
要创建池,请进入管理>池>创建并设置插槽,例如128,该插槽对我而言已成功运行。您也可以使用here进行配置。
答案 11 :(得分:0)
counter intuitive UI message! 我已经花了几天的时间。所以想详细说明我的具体问题。
每个 dag 都有一个状态。默认情况下,状态可以是“暂停”或“不暂停”。
第一个困惑来自 - 启动时的默认状态是什么?附加的 UI 消息似乎表明状态为“未暂停”,单击切换按钮时,它会暂停。
实际上,默认状态是“暂停”。这种状态可以通过设置、环境变量、参数和 UI 来控制。我在下面详细介绍了它们。
由于 UI 再次出现了第二个混淆。当我们手动触发处于暂停状态的 dag 时。 UI 显示 dag 正在运行(绿色圆圈)!但 dag 实际上处于“暂停”状态。除非“取消暂停”,否则不会执行任务。
如果我们阅读任务实例详细信息。消息将是
Task is in the 'None' state which is not a valid state for execution. The task must be cleared in order to be run.
什么是“无”状态!?并明确哪个任务?!
实际问题是dag处于暂停状态。在切换 dag 状态时,任务将开始执行。
dag 的暂停状态可以通过
改变DAG(dag_id='your-dag', is_paused_upon_creation=True)
dags_are_paused_at_creation = FALSE
AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION=False
答案 12 :(得分:0)
我遇到了类似的问题,触发 DAG 无限期“运行”,因为它的第一个任务卡在“排队”状态。
我意识到这是因为实际上更改了名称的“幽灵”DAG。似乎因为 DAG 在过去运行过(在 postgresDG 中有数据)并且在其他 DAG 中被引用为 child-DAG,引用旧名称的父 DAG 的触发器将“复活”旧的 DAG 名称,但是随着新代码。确实,旧的 DAG 名称和新的 DAG 代码不匹配,从而产生了“无限排队执行”的错误。
解决方案:
对该错误的解释可能会有所不同,但此修复程序对我的情况有效。