【问题标题】:Airflow Scheduler not picking up DAG Runs气流调度程序没有接收 DAG 运行
【发布时间】:2017-12-15 15:02:41
【问题描述】:

我正在设置气流,以便网络服务器在一台机器上运行,而调度程序在另一台机器上运行。两者共享相同的 MySQL Metastore 数据库。这两个实例在日志中都没有出现任何错误,但调度程序没有拾取通过 Web UI 手动触发 DAG 创建的任何 DAG 运行。

MySQL 中的 dag_run 表显示的条目很少,都处于运行状态:

mysql> select * from dag_run;
+----+--------------------------------+----------------------------+---------+------------------------------------+------------------+----------------+----------+----------------------------+
| id | dag_id                         | execution_date             | state   | run_id                             | external_trigger | conf   | end_date | start_date                 |
+----+--------------------------------+----------------------------+---------+------------------------------------+------------------+----------------+----------+----------------------------+
|  1 | example_bash_operator          | 2017-12-14 11:33:08.479040 | running | manual__2017-12-14T11:33:08.479040 |                1 | ��       }�.    | NULL     | 2017-12-14 11:33:09.000000 |
|  2 | example_bash_operator          | 2017-12-14 11:38:27.888317 | running | manual__2017-12-14T11:38:27.888317 |                1 | ��       }�.    | NULL     | 2017-12-14 11:38:27.000000 |
|  3 | example_branch_dop_operator_v3 | 2017-12-14 13:47:05.170752 | running | manual__2017-12-14T13:47:05.170752 |                1 | ��       }�.    | NULL     | 2017-12-14 13:47:05.000000 |
|  4 | example_branch_dop_operator_v3 | 2017-12-15 04:26:07.208501 | running | manual__2017-12-15T04:26:07.208501 |                1 | ��       }�.    | NULL     | 2017-12-15 04:26:07.000000 |
|  5 | example_branch_dop_operator_v3 | 2017-12-15 06:12:10.965543 | running | manual__2017-12-15T06:12:10.965543 |                1 | ��       }�.    | NULL     | 2017-12-15 06:12:11.000000 |
|  6 | example_branch_dop_operator_v3 | 2017-12-15 06:28:43.282447 | running | manual__2017-12-15T06:28:43.282447 |                1 | ��       }�.    | NULL     | 2017-12-15 06:28:43.000000 |
+----+--------------------------------+----------------------------+---------+------------------------------------+------------------+----------------+----------+----------------------------+
6 rows in set (0.21 sec)

但是在另一台机器上启动并连接到同一个 MySQL 数据库的调度程序只是对与该数据库通信并实际运行这些 DAG 运行并将它们转换为任务实例不感兴趣。

不确定我在此处的设置中缺少什么。这么几个问题:

  1. 何时以及如何填充位于 $AIRFLOW_HOME/dags 的 DAGS 文件夹?我认为它是在网络服务器启动时。但是如果我只是在另一台机器上启动调度程序,那台机器上的 DAGS 文件夹将如何被填满?
  2. 目前,我只在托管网络服务器的机器上执行气流 initdb,而不是在调度程序上。希望这是正确的。

我可以为调度程序启用调试日志以获取更多可能指示缺少什么的日志吗?从当前日志来看,它看起来只是在本地系统上的 DAGS 文件夹中查找,并且没有发现 DAGS(甚至没有示例),尽管配置加载示例设置为 True。

不认为这很重要,但我目前正在使用 LocalExecutor

感谢任何帮助。

编辑:我知道我需要按照气流文档的建议在机器之间同步 DAGS 文件夹,但不确定这是否是调度程序在上述情况下没有接收任务的原因。

【问题讨论】:

  • 我认为您应该将 dags(.py 脚本)部署到 $AIRFLOW_HOME/dags 目录中,如气流.conf 文件中所指定的那样。调度程序是在 dags 目录中查找、提取它们并将它们添加到 dag bag 的服务。要打开调试,您可以编辑 settings.py 文件,将 LOGGING_LEVEL 设置为 1logging.DEBUG1 并重新启动服务,例如github.com/apache/incubator-airflow/blob/master/airflow/…我认为最好忽略这些示例 dag,并尝试根据教程创建一个
  • 我的意思是,如果气流.cfg 说要加载示例,那么如果 Dags 文件夹中没有自创建的 dag,调度程序也应该工作。

标签: scheduler distributed airflow apache-airflow airflow-scheduler


【解决方案1】:

好的,我得到了答案 - 在本地 DAG 文件夹中有任何 DAGS 之前,调度程序似乎不会查询数据库。 job.py 中的代码看起来像

ti_query = (
        session
        .query(TI)
        .filter(TI.dag_id.in_(simple_dag_bag.dag_ids))
        .outerjoin(DR,
            and_(DR.dag_id == TI.dag_id,
                 DR.execution_date == TI.execution_date))
        .filter(or_(DR.run_id == None,
                not_(DR.run_id.like(BackfillJob.ID_PREFIX + '%'))))
        .outerjoin(DM, DM.dag_id==TI.dag_id)
        .filter(or_(DM.dag_id == None,
                not_(DM.is_paused)))
    )

我在托管调度程序的机器上的本地 DAG 文件夹中添加了一个简单的 DAG,它也开始拾取其他 DAG 实例。

我们为此提出了一个问题 - https://issues.apache.org/jira/browse/AIRFLOW-1934

【讨论】:

  • 我认为不可能仅基于数据库条目运行 dag。 dag 是一个 python 脚本,因此如果 dags 目录中没有脚本,则没有可运行的内容。如果您有 dags 的 DB 条目但文件夹中没有 dags,则会在 UI 中显示一个错误图标,说明这一点.
  • 感谢您解决这个问题。你能不能给我指点pickle周围的一些文档?究竟什么是酸洗 w.r.t dags - 如果不是关于 dag 代码,那么(反/)序列化正在发生什么
  • 我错了,工人可以从腌制的 dag 中逃跑,而且似乎有设置告诉工人是否使用腌制,而不是使用他们本地的 dag 副本。这主要在 cli 中控制,我相信调度程序服务也在内部使用它,请参阅 github.com/apache/incubator-airflow/blob/master/airflow/bin/… 并提到 donot_pickle conf 设置。它也用于 Mesos 集群:github.com/apache/incubator-airflow/blob/master/docs/… 使用-p 开关运行调度程序以允许对 dags 进行酸洗。
  • xcoms 也被序列化为气流 metadb,但它使用 json 而不是 pickle 格式,“防止 RCE 攻击”github.com/apache/incubator-airflow/blob/master/…
猜你喜欢
  • 1970-01-01
  • 2021-10-14
  • 2022-06-14
  • 1970-01-01
  • 2023-04-04
  • 2021-10-22
  • 2019-12-31
  • 2022-11-02
  • 2021-05-03
相关资源
最近更新 更多