ApacheAirflow学习笔记-1

93 阅读4分钟

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对象,所以不会被加载。