气流 - 如何仅“填充 DagBag”一次

Posted

技术标签:

【中文标题】气流 - 如何仅“填充 DagBag”一次【英文标题】:airflow - how to 'Filling up the DagBag' once only 【发布时间】:2019-09-15 02:35:58 【问题描述】:

我的 dag 需要大约 50 秒来解析,我只使用外部触发器来启动 dag 运行,没有时间表。我注意到气流想要填充 dagbag 很多 --> 在每个 trigger_dag 命令和在后台它会不断检查 dags 文件夹并在部署新的 .py 后立即创建 .pyc 文件。

无论如何我可以部署我的集群并获得一次填充!然后在接下来的 2 周内,在任何 trigger_dag 上立即开始 dagruns(现在需要 50 秒才能在开始前填充 dagbag)。我不需要在 2 周内更新 dag 定义。

【问题讨论】:

【参考方案1】:

50 秒对于 DAG 实例化来说是一个难以置信的巨大时间。看起来您在 DAG 文件中使用了一大段代码(或只是长时间工作)。是very坏practice:

注意:这意味着 DAG 文件中的所有***代码(即任何未定义 DAG 的代码)都将在每个调度程序检测信号中运行。除非绝对必要,否则尽量避免在 DAG 文件中添加***代码。

Airflow 的工作方式与您描述的完全一样。这就是为什么您应该将 DAG 文件夹中的 Python 文件主要视为配置文件(具有一些编程功能)。你不能用任何魔法配置键或类似的东西来改变它。这种行为是 Airflow 的核心。

【讨论】:

dag没有变化,为什么还要解析? 因为 Airflow 不知道它是否改变了。 Airflow 中的许多 DAG 都是以编程方式创建的,Airflow 在再次创建 DAG 之前无法看到更改。此外,ALL 个 DAG 会在每个心跳中重新创建,即使是静态 DAG。这是 IMO 巨大 Airflow 的缺点。 是的,尤其是在容器中使用它时:当 DAG 发生变化时我们会重新部署,但它在空闲时仍然会占用 CPU 和日志行。 有some options,但是好像没有效果。

以上是关于气流 - 如何仅“填充 DagBag”一次的主要内容,如果未能解决你的问题,请参考以下文章

如何防止气流回填dag运行?

气流 - 如何获得所有未来的运行日期

气流:任务调度间隔数秒,两次

气流回填澄清

气流:一次运行气流子项的模式

气流导出模式仅从 PostgreSQL 到 bigquery