一.关于Airflow
airflow 是一个使用python语言编写的data pipeline调度和监控工作流的平台。Airflow可以用来创建、监控和调整数据管道。任何工作流都可以在这个使用Python来编写的平台上运行。
Airflow是一种允许工作流开发人员轻松创建、维护和周期性地调度运行工作流(即有向无环图或成为DAGs)的工具。因此一些任务的执行及任务调度均可通过Airflow平台实现。最简单的理解就是一个高级版的crontab。它解决了crontab无法解决的任务依赖问题
这里解释几个概念:
DAGs:Airflow的核心概念,是DAG(有向无环图),DAG由一个或多个TASK组成,而这个DAG正是解决了任务间的依赖问题。Task A 执行完成后才能执行 Task B,多个Task之间的依赖关系可以很好的用DAG来表示。
operator:DAG定义了一个工作流,operators定义了工作流中的每一task具体做什么事情。一个operator定义工作流中一个task,每个operator是独立执行的,不需要和其他的operator共享信息。它们可以分别在不同的机器上执行。
如果你真的需要在两个operator之间共享信息,可以使用airflow提供的Xcom功能。
airflow目前有以下几种operator:
BashOperator:执行bash命令
PythonOperator:执行python命令
EmailOperator:执行发Email命令
HTTPOperator:执行Http命令
SqlOperator:执行Sql命令
SSHOperator:执行SSH命令
它就是 DAG 文件中的一个个 Operator ,它描述了具体的一个操作。
airflow 定义了很多的 Operator ,通常一个操作就是一个特定的 Operator , 比如调用 shell 命令要用 BashOperator ,调用 python 函数要用 PythonOperator , 发邮件要用 EmailOperator ,连 SSH 要用 SSHOperator 。
Trigger Rules定义了某个task在何种情况下执行。默认情况下,某个task是否执行,依赖于其父task(直接上游任务)全部执行成功。airflow允许创建更复杂的依赖。通过设置operator中的trigger_rule参数来控制:
all_success | 父task全success |
all_failed | 父task全failed 或者upstream_failed 状态 |
all_done | 父task全执行过,不管success or failed |
one_failed | 当父task中有一个是failed 状态时执行,不必等到所有的父task都执行 |
one_success | 当父task中有一个是success 状态时执行,不必等到所有的父task都执行 |
dummy | 无条件执行 |
该参数可以和depends_on_past
结合使用,当设置为true时,如果上一次没有执行成功,这一次无论如何都不会执行。
例如:
表明该task不依赖于上一次执行是否成功以及其上游task是否执行成功的影响
在一个可扩展的生产环境中,Airflow通常含有以下组件:
一个元数据库(MySQL或Postgres)
一组Airflow工作节点
一个Airflow调度器
一个调节器(Redis或RabbitMQ)
一个Airflow Web服务器
二、airflow如何使用
(1)如何将任务放到airflow里并指定其运行
1.首先需要将要执行的工作流套一个python实现的执行程序。在python脚本中定义dag、operator、task等细节,并指明依赖。下面用一个例子来说明
#测试依赖关系
"""
1 什么都不写 相当于[a,b,c] abc为一组 不计较顺序 但是成组执行 (中括号里的任务不计顺序 但是都会执行)
2 c>>a>>b >>左侧先执行 右侧依赖左侧 <<小于号相反
3
"""
from builtins import range
from datetime import datetime,timedelta
from airflow.models import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.dummy_operator import DummyOperator
from airflow.utils.dates import days_ago
# 定义默认参数
default_args = {
'owner': 'duoduo', # 拥有者名称
'start_date': datetime(2020, 3, 15, 10, 00), # 第一次开始执行的时间,为格林威治时间,为了方便测试,一般设置为当前时间减去执行周期
'retries': 3, # 失败重试次数
'retry_delay': timedelta(seconds=10) # 失败重试间隔
}
# 定义DAG
dag = DAG(
dag_id='1_test', # dag_id
default_args=default_args, # 指定默认参数
# schedule_interval="00, *, *, *, *" # 执行周期,依次是分,时,天,月,年,此处表示每个整点执行
schedule_interval=timedelta(seconds=20) # 执行周期,表示每20s执行一次,跟上一种crontab表示方式没什么区别
)
a = BashOperator( #通过BashOperator定义执行bash命令的任务
task_id='aaa',
depends_on_past=True,
bash_command='echo aaa >> /home/airflow/aa.txt ', #bash_command表明脚本语言是shell
#bash_command='echo `date` >> /home/airflow/aw.txt ',
dag=dag
)
b = BashOperator( #通过BashOperator定义执行bash命令的任务
task_id='bbb',
depends_on_past=True,
bash_command='echo bbb >> /home/airflow/bb.txt ',
dag=dag
)
c = BashOperator( #通过BashOperator定义执行bash命令的任务
task_id='ccc',
depends_on_past=True,
bash_command='echo ccc >> /home/airflow/cc.txt ',
dag=dag
)
c>>[a,b] #指明c执行优先级最高,执行成功并间隔了20s以后才执行a和b,且a,b的执行顺序随机
2.写完的脚本放到${AIRFLOW_HOME}/dags/下。这里我配置的AIRFLOW_HOME=/home/airflow
3.访问http://airflowadmin_url/admin/下的DAGs列表就能看到,如下图红框就是刚才那个新上传的dag,或者服务器命令行执行:airflow list_dags
4.将dag左边的按钮切换成on,表明开放了调度权限,然后根据dag设置的间隔时间,比如这里是设置的20s,那么从切换成on开始过20s这个dag将被调度并执行。
5.执行的任务执行情况可以通过logs查看
(2)关于operator再详细介绍一下
前面已经介绍过operator的种类,下面结合业务场景谈谈其中四种比较常用的operator:BashOperator、PythonOperator 、HTTPOperator 及SSHOperator。
1.BashOperator:
2.SSHOperator:脚本名称后面必须加空格且dag文件开始必须引入“from airflow.contrib.operators.ssh_operator import SSHOperator"