1、DAG文件存放路径
如果是通过ubuntu创建的,并且通过pip创建。会在"/home/username/airflow/"下要创建一个dags的文件夹
cd ~
cd airflow
mkdir dags
或者通过airflow下的配置文件查看,或者更改:
cd /home/username/airflow
vim airflow.cfg
dags_folder = /home/zch/airflow/dags
2、构建DAG
构建DAG共分为3步:首先创建DAG对象;然后定义DAG中的Task;最后定义Task之间的依赖
2.1、创建DAG对象
创建DAG对象的方法有3种:
2.1.1 使用with关键词
from airflow import DAG
from airflow.operators.dummy import DummyOperator
from airflow.utils.dates import days_ago
with DAG("some_dag_1", start_date=days_ago(2)) as dag1:
op = DummyOperator(task_id="some_task")
- some_dag_1: 表示dag_id
- start_date: 表示这个DAG开始调度的时间
- with: 关键词定义的代码块内部是定义Task的位置,这里创建了一个虚拟的Task,task_id(Task的ID)为some_task
2.1.2 使用标准构造器
from airflow import DAG
from airflow.operators.dummy import DummyOperator
from airflow.utils.dates import days_ago
dag1 = DAG("some_dag_2", start_date=days_ago(2))
op = DummyOperator(task_id="some_task", dag=dag1)
比较上面一个方法,只是在创建DAG时多了一个参数dag,用来指明Task的归属。
2.1.3 使用@dag装饰器创建DAG对象
from airflow import DAG
from airflow.operators.dummy import DummyOperator
from airflow.utils.dates import days_ago
@dag(start_date=days_ago(2))
def generate_dag():
op = DummyOperator(task_id="some_task")
dag1 = generate_dag()
使用@dag装饰器修饰一个python函数,Airflow会自动把这个函数转换成DAG。省略了dag_id,使用@dag装饰器构造的DAG,dag_id的默认值为函数的名字,即generate_dag。在generate_dag函数内部创建了一个虚拟的Task,task_id为some_task。
2.2 定义DAG中的Task
Task的类型有3种:
- Operator:Operator是最常见的Task类型,Airflow中大部分的Task都是Operator类型。Operator是一个大的类别,它包含很多子类,有专门发邮件的EmailOperator,有运行Bash命令的BashOperator,有执行Python函数的PythonOperator等。用户还可以自定义Operator。
- Sensor:Sensor是一种特殊类型的Operator,被设计用来等待某种信号。根据等待的信号不同,Sensor也派生出很多子类,比如等待文件系统上某个文件/目录的FileSensor,等待S3存储上的某个key的S3KeySensor。
- TaskFlow:TaskFlow是PythonOperator的一个替代品,较之后者更易于上手。
2.2.1 创建Operator类型的Task
from airflow.operators.bash importBashOperator
t1 = BashOperator(task_id="run_bash", bash_command="echo 1")
2.2.2 创建Sensor类型的Task
from airflow.sensors.filesystem import FileSensor
t1 = FileSensor(task_id="check_file", filepath="/tmp/file1")
2.2.3 创建TaskFlow类型的Task
from airflow.decorators import task
@task(task_id="print_context")
def print_context(**kwargs):
print(kwargs)
t1 = print_context()
使用@task装饰器修饰一个Python函数,随后显式的调用这个函数创建Task t1。Airflow会自动把@task装饰器修饰的函数转成Task。Task t1的task_id为print_context,这是在@task装饰器中指定的。
3 定义Task之间的依赖关系
如果DAG中包含多个Task,需要使用>>和<<操作符或set_upstream()和setdownstream()函数来定义Task之间的依赖关系。 使用 >> 和 << 操作符的示例如下:
t1 >> t2
t3 << t2
使用set_upstream()和set_downstream()函数进行改行,代码如下:
t2.set_upstream(t1)
t2.set_downstream(t3)
t1是t2的上游Task,t3是t2的下游Task
4、完整代码
from airflow import DAG
from airflow.operators.bash import BashOperator
from datetime import datetime, timedelta
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'email': ['444567367@qq.com'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5),
}
dag1 = DAG(
'show_full_dag',
default_args=default_args,
start_date=datetime(2023,1,1),
schedule_interval=timedelta(2)
)
t1 = BashOperator(
task_id='echo_1',
bash_command='echo 1',
dag=dag1
)
t2 = BashOperator(
task_id='sleep',
bash_command='sleep 5',
dag=dag1
)
t3 = BashOperator(
task_id='echo_2',
bash_command='echo 2',
dag=dag1
)
t2.set_upstream(t1)
t3.set_upstream(t1)
4.1 Dag加载和运行
4.1.1 加载DAG
Airflow默认会从DAGS的目录Python文件中加载DAG,只会把top level的对象当做DAG,比如
dag1 = DAG('this_dag_will_be_loaded')
def my_function():
dag2 = DAG('this_dag_will_not_be_loaded')
my_function()
只有dag1是top level的对象,因此会被加载,我们可以在Webserver UI上看到它。而dag2是在方法内部不是top level对象,所以不会被加载。