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个回答

0

需要检查的另一件事是"您的DAG的并发参数是否已经达到?"

当某些任务显示为NO STATUS时,我也遇到了同样的情况。

结果发现我的File_Sensor任务设置了1周的timeout,而DAG的超时时间仅为5小时。这导致很多传感器任务同时运行时文件丢失,从而导致并发过载!

在传感器任务成功之前,相关任务无法启动,当DAG超时时,它们会获得NO STATUS

我的解决方案:

  • 仔细设置任务和DAG timeout
  • 在AIRFLOW_HOME文件夹中的airflow.cfg文件中增加dag_concurrency

请参考文档。 https://airflow.apache.org/faq.html#why-isn-t-my-task-getting-scheduled


0

我在使用Celery 430,但是遇到了同样的问题。 - DJ_Stuffy_K

0
确保你的任务被分配到与你的工人所监听的队列相同的队列。这意味着在你的DAG文件中,你必须设置'queue':'queue_name',在你的工作程序配置中,你必须在airflow.cfg中设置default_queue='queue_name',或者在docker-compose.yaml中设置AIRFLOW__OPERATORS__DEFAULT_QUEUE:'queue_name'(如果你正在使用Docker)。

0
在我的情况下,任务没有被启动,因为我为所有的操作者配置了一个池,但是没有创建它,因此任务甚至没有被安排。一个操作者看起来像这样:
foo = DummyOperator(
    task_id='foo',
    dag=dag,
    pool='capser'
)

要创建一个池子,进入管理员界面,然后点击“池子”,再点击“创建”并设置槽位数量,比如128个,这对我来说运行得很成功。你也可以使用CLI进行配置。

0

反直觉的UI消息! 我已经花了几天时间来解决我的具体问题。

每个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.

什么是“None”状态?并且清楚哪个任务?!

实际问题是dag处于暂停状态。切换dag状态后,任务将开始执行。

可以通过以下方式更改dag的暂停状态:

  • 在UI上单击按钮。
  • 通过向您的dag添加以下参数来设置特定dag运行
DAG(dag_id='your-dag', is_paused_upon_creation=True)

  • 在airflow.cfg文件中设置config变量。(注意:这将启动所有的DAG,包括示例)
dags_are_paused_at_creation = FALSE
  • 在启动调度器/网页服务器之前配置环境变量。(注意:这将启动所有DAG,包括示例)
AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION=False


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