在Apache Airflow中创建DAG的方法

1,242 阅读3分钟

阅读时间: 4 分钟

如果你正在阅读这篇博客,我假设你已经熟悉了Apache Airflow的基本知识。

什么是DAG?

DAG是指有向无环图。简单地说,它是一个有节点、有向边、无循环的图。

在上面的例子中,第一个图是一个DAG,而第二个图不是一个DAG,因为有一个循环(节点A→节点B→节点C→节点A)。

在这里,在Apache Airflow中,"DAG "意味着 "数据管道"。它是用Python编程语言编写的。每当一个DAG被触发时,就会创建一个DAGRun。DAGRun是DAG的一个实例,在Airflow中有一个执行日期。

编写DAG文件的步骤:

  • 导入模块
  • 定义默认参数
  • 实例化DAG
  • 定义任务
  • 定义依赖关系

第1步:导入模块

导入工作流所需的Python依赖项。
要在Airflow中创建一个DAG,你总是要导入DAG类,即从airflow导入DAG。
接下来的导入与操作符有关,如BashOperator、PythonOperator、BranchPythonOperator等。

例子

from datetime import datetime
from airflow import DAG
from airflow.operators.bash import BashOperator
from airflow.operators.python import PythonOperator, BranchPythonOperator

第二步:定义默认参数

它定义了默认参数和DAG特定参数。如果default_args的字典被传递给一个DAG,它将把它们应用到它的任何操作者。这使得将一个普通的参数应用于许多操作符变得很容易,而不需要多次输入。

例子

default_args = {
   'owner': 'airflow',
   'depends_on_past': False,
   'email': ['airflow@example.com'],
   'email_on_retry': False,
   'retries': 1,
   'retry_delay': timedelta(minutes=5),
   'queue': 'bash_queue',
   'pool': 'backfill',
   'priority_weight': 10,
   'end_date': datetime(2016, 1, 1),
   'wait_for_downstream': False,
   'dag': dag,
   'sla': timedelta(hours=2),
   'execution_timeout': timedelta(seconds=300),
   'on_failure_callback': some_function,
   'on_success_callback': some_other_function,
   'on_retry_callback': another_function,
   'sla_miss_callback': yet_another_function,
   'trigger_rule': 'all_success'
}

步骤3:实例化DAG

给予DAG名称(应该是唯一的),配置时间表,并设置DAG设置

这里有几个选项,你可以用在你的schedule_interval上。你可以选择使用一些预设参数或类似cron的参数。

预设意义克隆
不安排,只用于 "外部触发 "的DAG。
一次安排一次,而且只有一次
@hourly每小时开始时运行一次0 * * * *
@daily每天午夜时分运行一次0 0 * * *
@weekly每周在周日上午的午夜运行一次0 0 * * 0
@月度每月一次,在该月的第一天午夜运行0 0 1 * *
@yearly每年在1月1日的午夜运行一次0 0 1 1 *

例子

  • 月度时间表。
    • schedule_interval='@monthly
    • schedule_interval='0 0 1 * *'。
  • 每小时的时间表。
    • schedule_interval='@hourly
    • schedule_interval='0 * * *'。

第4步:定义任务

下一步是布置工作流程中的所有任务。

DAG中的一个节点代表任务。 任务被排列成DAG,然后在它们之间设置上游和下游的依赖关系,以表达它们应该运行的顺序。

有三种基本类型的任务。

  • 操作员--预定义的任务模板,你可以快速地将其串联起来,构建DAG的大部分部分。
  • 传感器--操作者的一个特殊子类,完全是为了等待外部事件的发生。
  • TaskFlow--装饰了@task,它是一个被包装成任务的自定义Python函数。

例子。

task_1 = PythonOperator(
   task_id = "task_1",
   python_callable = # method_1
)

task_2 = BranchPythonOperator(
   task_id = "task_2",
   python_callable = # method_2
)

task_3 = BashOperator(
   task_id = "task_3",
   bash_command = "echo 'This is Task 3'"
)

第5步:定义依赖关系

使用任务的关键部分是定义它们之间的关系--它们的依赖关系,或者像我们在Airflow中所说的,它们的上游和下游任务。首先,你应该声明你的任务,然后你再声明它们的依赖关系。

有两种声明依赖关系的方法--使用>>和<<(位移)运算符。

first_task >> second_task >> [third_task, fourth_task]

或者更明确的set_downstream和set_upstream方法。

first_task.set_downstream(second_task)
third_task.set_upstream(second_task)

例如。

  • task_2和task_3依赖于task_1
    • task_1.set_downstream([task_2, task_3])
    • task_1 >> [task_2, task_3] 。
    • [task_2, task_3] << task_1