Airflow 当通过WebUI触发时,气流DAG将以递归错误方式爆炸 在对当前工作流进行重大重构/重写后,我正在测试更改 我仍然在LocalExecutor上,因为我的所有任务都在远程机器上执行一些命令(没有在同一台机器上执行实际的计算) DAG是通过python脚本生成的,该脚本读取本地存储的JSON文件(文件中每个JSON对象一个DAG)

Airflow 当通过WebUI触发时,气流DAG将以递归错误方式爆炸 在对当前工作流进行重大重构/重写后,我正在测试更改 我仍然在LocalExecutor上,因为我的所有任务都在远程机器上执行一些命令(没有在同一台机器上执行实际的计算) DAG是通过python脚本生成的,该脚本读取本地存储的JSON文件(文件中每个JSON对象一个DAG),airflow,Airflow,经过几天的重写,我能够以上述方式(编程方式)生成我的DAG 然而,当试图通过UI触发DAG时(在测试期间,我设置了schedule\u interval=Noneso触发器是手动的),DAG爆炸(核弹文本图像),并可能从以下堆栈跟踪(参见完整堆栈跟踪)抛出: 一旦我通过WebUI将Dag标记为失败,调度程序日志中的上述stacktrace就会消失(该Dag的TaskInstances将继续存在于Airflow的meta db中,除非我使用delete from..SQL查询手动删除它们)

经过几天的重写,我能够以上述方式(编程方式)生成我的DAG


然而,当试图通过UI触发DAG时(在测试期间,我设置了
schedule\u interval=None
so触发器是手动的),DAG爆炸(核弹文本图像),并可能从以下堆栈跟踪(参见完整堆栈跟踪)抛出:


一旦我通过WebUI将Dag标记为失败,调度程序日志中的上述stacktrace就会消失(该Dag的
TaskInstance
s将继续存在于Airflow的meta db中,除非我使用
delete from..
SQL查询手动删除它们)


我试过几件事都没有成功

  • 确定我的部署仍然完好无损(旧工作流的DAG仍在正常运行)
  • 多次关闭并重新启动Airflow的
    计划程序
    &
    Web服务器
  • db
  • 检查气流.cfg文件是否存在任何差异

我正在使用

  • Python
    3.7.3
    (通过安装)
  • 气流1.10.3
    带有
    LocalExecutor
  • Linux ip XXX XX XX XX 4.9.0-8-amd64#1 SMP Debian 4.9.130-2(2018-10-27)x86_64 GNU/Linux
正确地说,错误出现在一个自定义操作符中


我不小心使用了操作符类中定义的一个方法,
on_failure_callback
,因此该
kill_task()
方法的
self
参数导致了
递归错误
DAG的爆炸

class MyCustomOperator(BaseOperator):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.on_failure_callback = self.kill_task
    ..
    def kill_task(self) -> None:
        // do some cleanup work


kill_task()
方法移到类之外解决了问题

看起来我的工作流中有几个不同的问题。
scheduler
日志中的“int”和“NoneType”实例之间不支持“>=”
TypeError,因为我的代码(从JSON文件读取配置)无意中将
max\u active\u runs=None
传递给DAG对象,即(我们应该不传递任何内容,而不是显式传递
None
). 我还没有解决递归错误
您是否显示了任务顺序代码?例如,
task\u a>>task\u b
..@完全被摧毁,请查找
的“任务订单代码”
。此外,我忘了通知,一旦问题得到解决,Dag就开始运行,即任务正在执行(但在我触发它的那一刻,它仍然会显示带有递归错误的核弹屏幕=>即使它在后台开始正常运行),这是指向apache邮件列表上相应线程的链接。您创建的两个自定义运算符中可能存在错误。你能试着把它们注释掉(或者用DummyOperator替换掉)看看问题是否仍然存在。谢谢。犯了完全相同的错误。你为我节省了很多时间。
[2019-12-24 06:27:32,851] {jobs.py:1446} INFO - Processing derived_tables_presto_cbot_events_1
[2019-12-24 06:27:32,855] {jobs.py:921} INFO - Examining DAG run <DagRun derived_tables_presto_cbot_events_1 @ 2019-12-23 13:08:36.747641+00:00: manual__2019-12-23T13:08:36.747641+00:00, externally triggered: True>
[2019-12-24 06:27:32,856] {jobs.py:410} ERROR - Got an exception! Propagating...
Traceback (most recent call last):
  File "/home/admin/.pyenv/versions/3.7.3/lib/python3.7/site-packages/airflow/jobs.py", line 402, in helper
    pickle_dags)
  File "/home/admin/.pyenv/versions/3.7.3/lib/python3.7/site-packages/airflow/utils/db.py", line 73, in wrapper
    return func(*args, **kwargs)
  File "/home/admin/.pyenv/versions/3.7.3/lib/python3.7/site-packages/airflow/jobs.py", line 1760, in process_file
    self._process_dags(dagbag, dags, ti_keys_to_schedule)
  File "/home/admin/.pyenv/versions/3.7.3/lib/python3.7/site-packages/airflow/jobs.py", line 1451, in _process_dags
    self._process_task_instances(dag, tis_out)
  File "/home/admin/.pyenv/versions/3.7.3/lib/python3.7/site-packages/airflow/utils/db.py", line 73, in wrapper
    return func(*args, **kwargs)
  File "/home/admin/.pyenv/versions/3.7.3/lib/python3.7/site-packages/airflow/jobs.py", line 930, in _process_task_instances
    if len(active_dag_runs) >= dag.max_active_runs:
TypeError: '>=' not supported between instances of 'int' and 'NoneType'
class MyCustomOperator(BaseOperator):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.on_failure_callback = self.kill_task
    ..
    def kill_task(self) -> None:
        // do some cleanup work