Airflow任务卡在“排队”状态,从未运行。

35

我正在使用Airflow v1.8.1,并在kubernetes和Docker上运行所有组件(worker、web、flower、scheduler)。 我使用带有Redis的Celery Executor,我的任务看起来像:

(start) -> (do_work_for_product1)
     ├  -> (do_work_for_product2)
     ├  -> (do_work_for_product3)
     ├  …

所以start任务有多个下游。我将并发相关的配置设置如下:

parallelism = 3
dag_concurrency = 3
max_active_runs = 1

当我手动运行这个DAG时(不确定是否在计划任务上从未发生),一些下游任务得到执行,但其他任务停留在“queued”状态。

如果我从管理界面清除此任务,则它将被执行。 没有工作者日志(在处理了一些下游任务后,就没有输出任何日志了)。

Web服务器的日志(不确定worker exiting是否相关)

/usr/local/lib/python2.7/dist-packages/flask/exthook.py:71: ExtDeprecationWarning: Importing flask.ext.cache is deprecated, use flask_cache instead.
  .format(x=modname), ExtDeprecationWarning
[2017-08-24 04:20:56,496] [51] {models.py:168} INFO - Filling up the DagBag from /usr/local/airflow_dags
[2017-08-24 04:20:57 +0000] [27] [INFO] Handling signal: ttou
[2017-08-24 04:20:57 +0000] [37] [INFO] Worker exiting (pid: 37)

调度器上也没有错误日志,每次尝试此操作时,卡住的任务数量都在变化。

由于我也使用Docker,所以我想知道这是否有关系:https://github.com/puckel/docker-airflow/issues/94但目前还没有头绪。

有人遇到过类似问题或者有一些想法可以帮忙排查这个问题吗?


嗨@Norio,我们遇到了类似的问题,即队列中有任务但调度程序似乎忘记了其中的一些。当我再次使用"airflow scheduler"时,它们被拾起来了。我也使用了1.8.1版本、Kubernetes和Docker,但是使用LocalExecutor时出现了同样的问题。 - Chengzhi
@Chengzhi 谢谢你提供的信息。我使用这个shell https://github.com/apache/incubator-airflow/blob/ff45d8f2218a8da9328161aa66d004c3db3b367e/airflow/bin/airflow_scheduler_autorestart.sh 来自动重启调度器,而不依赖于k8s的back off,所以在我的情况下,调度器应该会定期重新启动,而不是永远挑选一些任务...非常奇怪。 - Norio Akagi
超棒,谢谢分享,非常奇怪,如果我发现了什么,我会让你知道的,但现在看起来这是解决方案。 - Chengzhi
4
我刚解决了一个问题,这个问题可能不像你的问题,但值得分享。我正在处理logs/文件夹中的文件,不小心改变了所有文件夹的拥有权。因此,Airflow无法将日志写入文件,任务一直停在排队状态。将所有文件的所有权更改回“airflow”用户后,应用程序恢复正常。sudo chown -R airflow:airflow logs/ - fernandosjp
请查看卡住/排队的任务实例日志并提供它们。我们在我们的环境中看到了这个问题,似乎是由于当服务器过于繁忙时发生的dagbag导入超时引起的。另请参阅此错误:https://issues.apache.org/jira/browse/AIRFLOW-1641?jql=project%20%3D%20AIRFLOW - Nick
显示剩余2条评论
6个回答

9

任务卡住很可能是一个 bug。目前(≤1.9.0alpha1),当任务在(远程)worker 上不能启动时,就会出现这种情况。例如,工作机器负载过高或缺少依赖项。

这个补丁应该解决了这个问题。

值得调查的是为什么你的任务没有进入“RUNNING”状态。将自己设置为此状态是任务执行的第一件事。通常,Worker 在开始执行之前会记录日志,并报告任何错误。你应该能够在任务日志中找到这些条目。

编辑:正如在原始问题的评论中提到的那样,Airflow 无法运行任务的一个例子是当它无法写入所需的位置时。这使其无法继续进行,从而导致任务卡住。该补丁通过从调度程序中失败任务来修复此问题。


3
我们发现在1.9.0版本中出现了这个问题,任务被排入队列但除非从用户界面手动执行,否则永远不会进入运行状态。 - l0n3r4n83r

3
请尝试使用airflow schedulerairflow worker命令。
我认为airflow worker调用每个任务,airflow scheduler在两个任务之间调用。

这可能不是问题的解决方案,但至少通过运行这些命令,您可以了解问题所在,例如如果它们出现错误。 - poorva

3
我们有一个解决方案,想在1.9正式发布之前在这里分享。感谢Bolke de Bruin对1.9的更新。在1.9之前的情况下,我们目前正在使用1.8.1,为了清除停留在队列状态超过30分钟的任务,需要运行另一个DAG。

你能否告诉我这个DAG的代码在哪里可以获取到呢?我也有这个问题,但需要一些时间才能迁移到更新版本的Airflow。 - Pierre

3
我一直在使用相同的Docker镜像puckel。我的问题已经通过以下方式解决:
替换
 result_backend = db+postgresql://airflow:airflow@postgres/airflow

使用

celery_result_backend = db+postgresql://airflow:airflow@postgres/airflow

我认为这个更改已经在puckel的最新拉取中更新了。该更改在2018年2月左右被撤销,而您的评论是在1月份发表的。

我正在使用Puckel镜像,并且想在容器上运行一些命令,例如airflow dag_state spark_python,但我遇到了以下错误:airflow.exceptions.AirflowConfigException: error: cannot use sqlite with the CeleryExecutor。你知道为什么我不能运行吗? - ugur

2

我通过谷歌搜索到这里,我的情况是使用MWAA时,我的Airflow运行了很多任务,但资源有限。我发现几个Airflow DAG处于排队状态,所以我认为这是一个资源问题。

增加分配给我的Airflow实例的环境类别的资源解决了这个问题:DAG得到了解锁并恢复了工作。


1
在我的情况下,所有的Airflow任务都被卡住了,没有一个在运行。以下是我所做的修复步骤:
  1. 使用$ kill -9 <pid>杀死所有的Airflow进程。
  2. 使用$ pkill celery杀死所有的celery进程。
  3. 增加airflow.cfg文件中celery的worker_concurrencyparallelismdag_concurrency配置项的计数。
  4. 启动Airflow时,首先检查Airflow Web服务器是否自动启动,如果像我一样通过Gunicorn运行,则使用$ airflow webserver &手动启动。
  5. 启动Airflow调度器$ airflow scheduler
  6. 启动Airflow工作进程$ airflow worker
  7. 尝试运行作业。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接