Airflow 2.0-计划程序无法在序列化的_DAG表中找到序列化的DAG

Airflow 2.0-计划程序无法在序列化的_DAG表中找到序列化的DAG,airflow,airflow-scheduler,Airflow,Airflow Scheduler,我在dags目录中有两个文件—dag_1.py和dag_2.py dag_1.py创建静态dag,而dag_2.py基于某个位置的外部json文件创建动态dag 静态DAG(由DAG_1.py创建)包含一个稍后阶段的任务,该任务为DAG_2.py生成一些输入json文件,动态DAG就是以这种方式创建的 在未使用DAG序列化的Airflow 1.x版本中,这种方法可以很好地工作。但在Airflow 2.0中,DAG序列化已成为强制性的。有时,在生成动态DAG时,我会在调度程序中遇到以下异常- [2

我在dags目录中有两个文件—dag_1.py和dag_2.py

dag_1.py创建静态dag,而dag_2.py基于某个位置的外部json文件创建动态dag

静态DAG(由DAG_1.py创建)包含一个稍后阶段的任务,该任务为DAG_2.py生成一些输入json文件,动态DAG就是以这种方式创建的

在未使用DAG序列化的Airflow 1.x版本中,这种方法可以很好地工作。但在Airflow 2.0中,DAG序列化已成为强制性的。有时,在生成动态DAG时,我会在调度程序中遇到以下异常-

[2021-01-02 06:17:39,493] {scheduler_job.py:1293} ERROR - Exception when executing SchedulerJob._run_scheduler_loop
Traceback (most recent call last):
  File "/global/packages/python/lib/python3.7/site-packages/airflow/jobs/scheduler_job.py", line 1275, in _execute
    self._run_scheduler_loop()
  File "/global/packages/python/lib/python3.7/site-packages/airflow/jobs/scheduler_job.py", line 1377, in _run_scheduler_loop
    num_queued_tis = self._do_scheduling(session)
  File "/global/packages/python/lib/python3.7/site-packages/airflow/jobs/scheduler_job.py", line 1474, in _do_scheduling
    self._create_dag_runs(query.all(), session)
  File "/global/packages/python/lib/python3.7/site-packages/airflow/jobs/scheduler_job.py", line 1557, in _create_dag_runs
    dag = self.dagbag.get_dag(dag_model.dag_id, session=session)
  File "/global/packages/python/lib/python3.7/site-packages/airflow/utils/session.py", line 62, in wrapper
    return func(*args, **kwargs)
  File "/global/packages/python/lib/python3.7/site-packages/airflow/models/dagbag.py", line 171, in get_dag
    self._add_dag_from_db(dag_id=dag_id, session=session)
  File "/global/packages/python/lib/python3.7/site-packages/airflow/models/dagbag.py", line 227, in _add_dag_from_db
    raise SerializedDagNotFound(f"DAG '{dag_id}' not found in serialized_dag table")
airflow.exceptions.SerializedDagNotFound: DAG 'dynamic_dag_1' not found in serialized_dag table
在此之后,调度程序将终止,这是预期的。 当我在此错误后手动检查表时,我能够看到其中的DAG条目


这个问题不是一直都可以复制的。可能的原因是什么?是否有我应该尝试调整的气流配置?

没有足够的代表发表评论,因此必须留下答案,但是:

  • 这是干净的2.0安装还是旧1.10.x实例的升级?及
  • 你在回收这些名字吗
  • 我真的碰到了这个问题(我在谷歌上发现了这个问题,想看看还有谁在同一条船上)

    在我的例子中,它是一个升级的现有1.10.x安装,虽然DAG是动态生成的,但名称是循环使用的。我在GUI中单击dag时出错,这会杀死调度程序

    结果是(TM),完全使用GUI概述中的“垃圾桶”按钮删除DAG,并让它们重新生成修复了它(如中所示,问题立即消失,在过去30分钟内没有再次出现)


    据猜测,在我看来,动态DAG的某些方面可能在
    db升级步骤中没有正确迁移,清除它们并让它们完全重新生成修复了问题。显然,你失去了所有的历史记录等,但(至少在我的情况下)这不一定是什么大事。

    没有足够的代表发表评论,所以不得不留下答案,但是:

  • 这是干净的2.0安装还是旧1.10.x实例的升级?及
  • 你在回收这些名字吗
  • 我真的碰到了这个问题(我在谷歌上发现了这个问题,想看看还有谁在同一条船上)

    在我的例子中,它是一个升级的现有1.10.x安装,虽然DAG是动态生成的,但名称是循环使用的。我在GUI中单击dag时出错,这会杀死调度程序

    结果是(TM),完全使用GUI概述中的“垃圾桶”按钮删除DAG,并让它们重新生成修复了它(如中所示,问题立即消失,在过去30分钟内没有再次出现)


    据猜测,在我看来,动态DAG的某些方面可能在
    db升级步骤中没有正确迁移,清除它们并让它们完全重新生成修复了问题。显然,您丢失了所有历史记录等,但(至少在我的情况下)这不一定是什么大问题。

    按照以下顺序更新后,我们遇到了相同的问题:

  • 1.10.12->1.10.14
  • 1.10.14->2.0.0
  • 我已经按照他们的指导完成了,我们没有任何问题,直到几个小时后,调度程序开始崩溃,抱怨数据库中找不到随机DAG

    我们的部署过程包括清除
    /opt/aiffort/dags
    文件夹,每次都进行一次干净的安装(我们将dag和支持代码存储在python包中)

    因此,在1.10.x版本上,我们时不时会遇到这样的情况:调度器解析一个空文件夹并从数据库中删除序列化的DAG,但它总是能够在下次解析时恢复图片

    显然,在2.0中,作为调度器HA的一部分,它们完全分离了DAG处理器和调度器。这会导致竞争条件:

    • 若调度程序作业在DAG处理器更新序列化的_DAG表值之前命中数据库,它将什么也找不到并崩溃
    • 如果运气在你这边,上述情况就不会发生,你也不会看到这个例外

    为了解决这个问题,我通过更新数据库中的
    is_pause
    来禁用所有DAG的调度,重新启动调度程序,一旦它生成序列化的DAG,就将所有DAG重新打开,更新后的问题如下所示:

  • 1.10.12->1.10.14
  • 1.10.14->2.0.0
  • 我已经按照他们的指导完成了,我们没有任何问题,直到几个小时后,调度程序开始崩溃,抱怨数据库中找不到随机DAG

    我们的部署过程包括清除
    /opt/aiffort/dags
    文件夹,每次都进行一次干净的安装(我们将dag和支持代码存储在python包中)

    因此,在1.10.x版本上,我们时不时会遇到这样的情况:调度器解析一个空文件夹并从数据库中删除序列化的DAG,但它总是能够在下次解析时恢复图片

    显然,在2.0中,作为调度器HA的一部分,它们完全分离了DAG处理器和调度器。这会导致竞争条件:

    • 若调度程序作业在DAG处理器更新序列化的_DAG表值之前命中数据库,它将什么也找不到并崩溃
    • 如果运气在你这边,上述情况就不会发生,你也不会看到这个例外
    为了解决这个问题,我通过更新数据库中的
    is_paused
    来禁用所有DAG的调度,重新启动调度程序,一旦它生成序列化DAG,就将所有DAG重新打开我修复了这个问题,该问题将作为Airflow 2.0.1的一部分发布

    下周将发布Airflow 2.0.1(最有可能是2021年2月8日)。

    我修复了此问题,该问题将作为Airflow 2.0.1的一部分发布

    意志