DAG依赖,延迟加载
DAG dependencies, lazy loading
在导入 Python 文件时,在 Airflow 中,调度程序会读取我的所有依赖项。因为我的依赖项很慢并且调用本地库,所以我想将 DAG 计划与实际任务分开。我打算将任务发送到云端。
Airflow 只导入 schedule 和 DAG 定义,直到实际使用才导入任务依赖的正确设计是什么?什么是优点,缺点?
这在很大程度上取决于您的 DAG 设计。
通常尝试使任何顶级代码无效,包括逻辑(读取变量、执行某些函数等)和导入。这可以通过使用某种形式的延迟评估来完成。
在导入的情况下,您可以尝试将导入烘焙到仅在执行期间调用的函数中(例如,通过创建自定义运算符或使用 python 运算符)。
聚会有点晚了。
正如 Tomasz 所说,它在很大程度上取决于您的 DAG 结构,顺便说一句,为了避免调度程序进行依赖性解析,您可以使用一种设计模式来“隐藏”您的依赖性直到执行时间。如果您使用 PythonOperator 或 PythonVenvOperator,一种方法是将您的导入移动到 DAG 内的支持函数中。
https://airflow.apache.org/docs/apache-airflow/stable/best-practices.html#:~:text=top&level&python&code
一般来说,如果你想在 whl 包中调用一个 Python 函数,你可以在你的 DAG 中构建一个“包装函数”,它将导入依赖项,然后调用实际函数。在 PythonOperator 中,您将调用“包装函数”,而不是直接调用实际的目标函数。
希望这有帮助。
在导入 Python 文件时,在 Airflow 中,调度程序会读取我的所有依赖项。因为我的依赖项很慢并且调用本地库,所以我想将 DAG 计划与实际任务分开。我打算将任务发送到云端。
Airflow 只导入 schedule 和 DAG 定义,直到实际使用才导入任务依赖的正确设计是什么?什么是优点,缺点?
这在很大程度上取决于您的 DAG 设计。
通常尝试使任何顶级代码无效,包括逻辑(读取变量、执行某些函数等)和导入。这可以通过使用某种形式的延迟评估来完成。
在导入的情况下,您可以尝试将导入烘焙到仅在执行期间调用的函数中(例如,通过创建自定义运算符或使用 python 运算符)。
聚会有点晚了。 正如 Tomasz 所说,它在很大程度上取决于您的 DAG 结构,顺便说一句,为了避免调度程序进行依赖性解析,您可以使用一种设计模式来“隐藏”您的依赖性直到执行时间。如果您使用 PythonOperator 或 PythonVenvOperator,一种方法是将您的导入移动到 DAG 内的支持函数中。 https://airflow.apache.org/docs/apache-airflow/stable/best-practices.html#:~:text=top&level&python&code 一般来说,如果你想在 whl 包中调用一个 Python 函数,你可以在你的 DAG 中构建一个“包装函数”,它将导入依赖项,然后调用实际函数。在 PythonOperator 中,您将调用“包装函数”,而不是直接调用实际的目标函数。 希望这有帮助。