【问题标题】:Airflow task with null status状态为空的气流任务
【发布时间】:2018-11-15 10:15:48
【问题描述】:

我在 EC2 上的 24xlarge 机器上运行时遇到了气流问题。

我必须注意并行度是256。

在某些日子里,dagrun 以“失败”状态结束,原因有两个:

  1. 某些任务的状态为“upstream_failed”,这是不正确的,因为我们可以清楚地看到前面的所有步骤都成功了。

  2. 其他任务的状态不是“null”,它们还没有开始,它们会导致 dagrun 失败。

我必须注意这两个任务的日志都是空的

这里是这些案例的品尝实例详细信息:

请问有什么解决办法吗?

【问题讨论】:

  • 运算符也为空?
  • 是的,它始终为空

标签: python amazon-s3 airflow airflow-scheduler


【解决方案1】:

我遇到第二种情况(“其他任务的状态不是'null'”)的另一种情况是任务实例发生了变化,特别是操作符类型发生了变化。

我希望您已经得到答案/能够继续前进。上个月我在这个问题上遇到过几次,所以我想我会记录我最终为解决这个问题所做的工作。


例子:

  • Task Instance 最初是 SubDag Operator 的一个实例
  • 要求导致运算符的类型从 SubDag 运算符更改为 Python 运算符
  • 更改后,Python Operator 设置为状态 NULL

尽我所能,正在发生的事情是:

  • Airflow 正在自省与每个任务关联的操作员
  • 每个任务实例都记录到数据库表task_instance
    • 此表有一个名为operator 的属性
  • 当调度程序重新自省代码时,它会查找具有正确运算符类型的task_instance;没有看到它,它将关联的数据库记录更新为 state = 'removed'
  • 当 DAG 随后调度时,气流

您可以通过查询查看受此过程影响的任务:

SELECT *
FROM task_instance
WHERE state = 'removed'

气流 1.10 似乎已经解决了这个问题:

话虽如此,我不能 100% 确定基于我能找到的提交可以解决这个问题。似乎总体哲学仍然是"when a DAG changes, you should increment / change the DAG name"

我不喜欢这种解决方案,因为它很难迭代本质上是一个管道的东西。我使用的替代方法是(部分地)遵循recommendations from Astronomer 并“吹灭” DAG 历史。为此,您需要:

  • 停止调度程序
  • Delete the history from the dag
    • 这应该会导致 DAG 从 Web UI 中完全消失
    • 如果它没有完全消失,说明调度程序仍在某个地方运行
  • 重新启动调度程序
    • 注意:如果您按计划运行 DAG,请准备好让它回填/赶上/运行其最新计划,因为您已删除历史记录
    • 如果您不希望它这样做,可以应用 Astronomer 的“Fast Forward a DAG”建议

【讨论】:

    【解决方案2】:

    当任务状态被手动更改(可能通过“标记成功”选项)或强制进入状态(如upstream_failed)并且任务从未在记录中收到hostname 值并且不会有任何日志或 PID

    【讨论】:

    • 这很奇怪,因为没有发生人工干预。
    • upstream_failed 状态应用于由于依赖失败而无法运行的任务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多