Airflow 1.9.0正在排队但未启动任务。

65

Airflow偶尔不会运行排队的任务,有些任务甚至不会被排队状态。我在调度程序日志中不断看到以下内容:

 [2018-02-28 02:24:58,780] {jobs.py:1077} INFO - No tasks to consider for execution.

我在数据库中看到一些任务没有状态或者状态为queued,但它们从未开始执行。

Airflow的设置正在ECS上使用Redis运行https://github.com/puckel/docker-airflow。有4个调度线程和4个Celery worker任务。对于那些没有运行的任务,在悬停在任务图标上时显示为queued状态(灰色图标),运算符为null,任务详细信息如下:

    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中还有一些任务无状态(白色图标)。

值得注意的是,当我重新启动调度程序时,任务会变为运行状态。


我们需要更多关于您的Airflow设置的信息,例如Airflow配置和正在工作/未工作的DAG。请记住,Airflow每次只会将有限数量的任务放入队列状态(而不是无限期)。当这些任务从null状态转换为scheduled并进入队列时,更多任务将进入队列状态。您是否使用了CeleryExecutor或其他东西?如果是,请确保已经启动了Celery worker。 - Taylor D. Edmiston
@TaylorEdmiston 我在那里添加了一些细节。 - l0n3r4n83r
@TaylorEdmiston 当调度程序重新启动时,排队的任务开始运行。 - l0n3r4n83r
@tobi6 发生在不依赖于过去任务的情况下。 - l0n3r4n83r
@l0n3r4ng3r,我已经添加了下面的答案,并加入了一些更多的背景信息。 - Taylor D. Edmiston
1
我们偶尔会遇到相同的问题。每10分钟/小时重新启动调度程序似乎是一个疯狂的解决方案,但这是我们要走的路。我鼓励你向Jira提交一个问题。 - Teresa
15个回答

110

Airflow的设置可能有些棘手。

  • 你是否正在运行airflow scheduler
  • 你是否正在运行airflow webserver
  • 你是否检查了所有要运行的DAG在web界面中是否设置为On
  • 你想运行的所有DAG是否都具有过去的开始日期?
  • 你想运行的所有DAG是否具有正确的时间表,显示在web界面中?
  • 如果其他方法都不起作用,可以使用web界面点击dag,然后选择Graph View。现在选择第一个任务并点击Task Instance。在段落Task Instance Details中,你将看到DAG等待或未运行的原因。

例如,我曾经遇到一个DAG被错误地设置为depends_on_past: True,这导致当前实例无法正确启动。

另外,在文档中直接提供了一些更多提示的资源:为什么我的任务没有被调度?


12
任务被调度但未运行的另一个可能原因是它们可能被分配到未定义的池中。 - aparkerlue
54
最近我通过痛苦而非常令人沮丧的方式发现,你的第三个要点,确保DAG设置为“On”,也是手动触发DAG所必需的。这对我来说毫无意义,为什么我必须安排DAG来手动触发它?你知道Airflow文档中是否有解释这一设计选择的内容吗?因为我认为这非常反直觉。 - Dan
3
很棒的清单! - knutole
2
有用的答案,帮助了多次。 - aveLestat
2
这应该是被接受的答案。这是正确的清单。 - kabirbaidhya
显示剩余2条评论

16

我也在运行 puckel/docker-airflow 存储库的分支,大部分使用 Airflow 1.8 已经一年了,处理了超过1000万个任务实例。我认为这个问题在1.9版本中仍然存在,但我不能确定。

由于某些原因,Airflow调度器似乎存在长期存在的性能问题。我已经阅读了调度器代码,但仍不清楚在新启动时会发生什么不同的事情来重新恢复正常调度。一个主要的区别是预定和排队任务状态的重建。

Airflow wiki 的调度器基础知识提供了关于调度器工作及其各种状态的简洁参考。

大多数人通过定期重启调度程序来解决调度程序吞吐量下降的问题。我个人发现每小时重启成功,但也看到有人使用每5-10分钟频率的方法。在尝试重新启动间隔时,需要考虑任务卷、任务持续时间和并行设置。

更多信息,请参见:

这个问题过去可以通过使用SCHEDULER_RUNS配置设置每隔X次运行重新启动来解决,尽管该设置最近从默认的systemd脚本中被删除

您还可以考虑发布到Airflow开发者邮件列表。我知道这个问题在那里已经讨论了几次,其中一位核心贡献者可能能够提供更多背景信息。

相关问题


1
调度程序应该经常重新启动,但没有指定如何重新启动。运行 airflow scheduler 会创建另一个调度程序的作业,而不是关闭旧的作业。 - jack
嗨@jack - 要重新启动调度程序,请在前台按Ctrl-C以终止进程(就像从Shell杀死任何其他前台进程一样)。 然后再次运行$airflow scheduler。 我认为同时运行2个调度程序实例是不安全的,因为我相信存在可能的竞争条件; 我自己没有尝试过同时运行多个调度程序实例。 - Taylor D. Edmiston
如果调度程序正在使用 airflow scheduler -D 运行,那么就没有 ctrl-c 可以按了。我认为Airflow应该防止在不关闭和重新启动的情况下重启调度程序的命令。 - jack
在这种情况下,您需要使用标准的 kill 命令之一:killpkillkillall。更多信息请参见 https://www.tecmint.com/how-to-kill-a-process-in-linux/。 - Taylor D. Edmiston
我自己没有检查过,但你可以检查一下airflow.cfg中的心跳超时时间,看看是否有一个检查调度程序并更新其内容的设置。我对此并不确定。但我可以说,我已经在数十个Airflow实例上进行了许多次重启,这个方法从1.8版本开始就一直适用。 - Taylor D. Edmiston
显示剩余3条评论

8

确保start_date不使用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(除非打算进行回填)。

根据设计,Airflow DAG将在其schedule_interval完成后执行

这意味着在开始日期之后的一个schedule_interval上执行。例如,每小时的DAG将在三点钟执行其两点钟运行。这里的原因是因为Airflow无法确保与2pm间隔对应的所有数据在该小时间隔结束之前都存在。

这是Airflow的一个奇怪方面,但是如果您使用默认变量和宏,尤其是需要记住的重要方面。

Airflow中的时间默认为UTC

鉴于您的其他数据库和API很可能也遵循这种格式,因此这不应该让人感到惊讶,但值得澄清。

完整文章和来源在这里


非常感谢。我将datetime.today()作为start_date,但无法运行任务。一旦我将其更改为任何过去的日期,它就可以工作了。非常感谢。 - Vaibhav Sahu

6
我也遇到了类似的问题,但这主要与SubDagOperator相关,总共有3000多个任务实例(30个任务* 44个子DAG任务)。
我发现,airflow scheduler主要负责将您的计划任务放入“Queued Slots”(池)中,而airflow celery workers则会挑选您排队的任务并将其放入“Used Slots”(池)中并运行它。
根据您的描述,您的scheduler应该正常工作。建议您检查“celery workers”的日志是否有任何错误,或重新启动它以查看是否有帮助。我经历过一些问题,即celery workers通常会罢工几分钟,然后再次开始工作(尤其是在SubDagOperator上)。

“queue”槽中的任务是否应该没有主机名?我们遇到这样的情况,所有“已使用的槽”都在worker-0中,其余的“排队槽”没有主机名...而我们有6个pod/worker。 - soMuchToLearnAndShare
1
当Airflow Celery Workers挑选您的排队任务并将其放入“已使用的插槽”(池)并运行时,“Re”会发生。如果我们发现工作人员处于空闲状态,我们如何优雅地重新启动工作人员?(Kubectl logs worker-0命令显示最近的活动是几天前),而queued slots中有许多排队的任务。 - soMuchToLearnAndShare

5

其中一个非常愚蠢的原因可能是DAG处于“暂停”状态,这是第一次的默认状态。我曾经把它作为敌人战斗了大约2小时。如果您正在使用Airflow Web界面,则此选项会显示为列表中DAG旁边的开关。


我也是!我一直在尝试各种标志,直到我在UI中看到DAG被暂停了。 - Stefan Papp
为什么暂停的状态下会显示“运行中”,Airflow开发人员应该看到这个问题。 - jeroaranda
同意。如果Airflow能在这种情况下显示警告,那就更好了。 - Seeni

4

我的问题更进一步,除了我的任务排队外,我在Flower UI上看不到任何一个celery worker。解决方法是,由于我将celery worker作为root运行,我必须对我的~/.bashrc文件进行更改。

按照以下步骤操作即可:

  1. 在你的~/.bashrc文件中添加export C_FORCE_ROOT=true
  2. 输入source ~/.bashrc
  3. 运行worker:nohup airflow worker $* >> ~/airflow/logs/worker.logs &

检查你的Flower UI,地址是http://{HOST}:5555


执行像root一样的问题也困扰了我,多亏了你的答案,我才能够解决它。 不过我没有按照这些步骤,而是创建了一个名为“airflow”的用户: export AIRFLOW_HOME="/opt/airflow",然后 useradd -ms /bin/bash -d ${AIRFLOW_HOME} airflow,接着 chown -R airflow: ${AIRFLOW_HOME},最后 su airflow -c "nohup airflow flower &" - Eric Sant'Anna

4
我今天遇到了这个问题,发现下面 tobi6 回答中的第四个圆点起作用并解决了问题。
*'Do all the DAGs you want to run have a start date which is in the past?'*

我正在使用 Airflow 版本 v1.10.3


如果条件为真,我不明白应该怎么做? - sann05
@sann05 简单来说,为 start_date 添加一个日期时间条目即可! - Shahbaz Ali
不要使用datetime.now(),请参考我下面的答案。 - NicoKowe

3
我认为值得一提的是,有一个未解决的问题可能会导致任务无明显原因失败:https://issues.apache.org/jira/browse/AIRFLOW-5506 当使用连接到PostgreSQL airflow数据库的LocalScheduler时,这个问题似乎会发生,会导致调度程序记录多个“Killing PID xxxx”行。在DAG停滞不前,并且一段时间内没有启动任何新任务后,请检查调度器日志。

2

我遇到了类似的问题,即一个触发的DAG因其第一个任务处于“排队”状态而无限期地“运行”。

我意识到这是由于实际上更改了名称的“幽灵”DAG。似乎由于DAG在过去已经运行过(在postgresDG中有数据)并且被其他DAG引用为子DAG,引用旧名称的父DAG的触发器将“复活”旧的DAG名称,但使用新的代码。事实上,旧的DAG名称和新的DAG代码不匹配,从而产生“无限排队执行”错误。

解决方案:

  1. 删除以前具有旧名称的所有先前DAG运行
  2. 重新启动所有内容(webserver、worker、executor等)或使用UI中的“删除DAG”按钮删除相关DAG。

错误的解释可能会有所不同,但在我的情况下,这个修复方法有效。


2

您可以尝试停止网络服务器和调度程序:

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选项将使服务在后台运行。


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