Airflow的使用及注意事项

一.关于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命令

task 任务

它就是 DAG 文件中的一个个 Operator ,它描述了具体的一个操作。

Operator 执行器

airflow 定义了很多的 Operator ,通常一个操作就是一个特定的 Operator , 比如调用 shell 命令要用 BashOperator ,调用 python 函数要用 PythonOperator , 发邮件要用 EmailOperator ,连 SSH 要用 SSHOperator 。

Trigger Rules

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架构

在一个可扩展的生产环境中,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将被调度并执行。

  • Recent Tasks
    这里包含9个圆圈,每个圆圈代表task的执行状态和次数
    圈1 success:现实成功的task数,基本上就是该tag包含多少个task,这里基本上就显示几。
    圈2 running:正在运行的task数
    圈3 failed:失败的task数
    圈4 unstream_failed:
    圈5 skipped:跳过的task数
    圈6 up_for_retry:执行失败的task,重新执行的task数
    圈7 queued:队列,等待执行的task数
    圈8 :
    圈9 scheduled:刚开始调度dag时,这一次执行总共调度了dag下面多少个task数,并且随着task的执行成功,数值逐渐减少。
  • Last Run
    dag最后执行的时间点
  • DAG Runs
    这里显示dag的执行信息,包括3个圆圈,每个圆圈代表dag的执行状态和次数
    圈1 success:总共执行成功的dag数,执行次数
    圈2 runing:正在执行dag数
    圈3 faild:执行失败的dag数

  • Code View
    查看任务执行代码
  • Logs
    查看执行日志,比如失败原因
  • Refresh
    刷新dag任务
    -Delete Dag
    删除该dag任务

5.执行的任务执行情况可以通过logs查看

(2)关于operator再详细介绍一下

前面已经介绍过operator的种类,下面结合业务场景谈谈其中四种比较常用的operator:BashOperator、PythonOperator 、HTTPOperator 及SSHOperator。

1.BashOperator:

2.SSHOperator:脚本名称后面必须加空格且dag文件开始必须引入“from airflow.contrib.operators.ssh_operator import SSHOperator"

 

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值