阅读时间: 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