airflow介绍
1. airflow 介绍
1.1 airflow 是什么
Airflow is a platform to programmatically author, schedule and monitor workflows.
airflow 是一个编排、调度和监控workflow的平台,由Airbnb开源,现在在Apache Software Foundation 孵化。airflow 将workflow编排为tasks组成的DAGs,调度器在一组workers上按照指定的依赖关系执行tasks。同时,airflow 提供了丰富的命令行工具和简单易用的用户界面以便用户查看和操作,并且airflow提供了监控和报警系统。
1.2 airflow 核心概念
- DAGs:即有向无环图(Directed Acyclic Graph),将所有需要运行的tasks按照依赖关系组织起来,描述的是所有tasks执行的顺序。
- Operators:可以简单理解为一个class,描述了DAG中一个具体的task具体要做的事。其中,airflow内置了很多operators,如
BashOperator
执行一个bash 命令,PythonOperator
调用任意的Python 函数,EmailOperator
用于发送邮件,HTTPOperator
用于发送HTTP请求,SqlOperator
用于执行SQL命令…同时,用户可以自定义Operator,这给用户提供了极大的便利性。 - Tasks:Task 是 Operator的一个实例,也就是DAGs中的一个node。
- Task Instance:task的一次运行。task instance 有自己的状态,包括“running”, “success”, “failed”, “skipped”, “up for retry”等。
- Task Relationships:DAGs中的不同Tasks之间可以有依赖关系,如
TaskA >> TaskB
,表明TaskB依赖于TaskA。
通过将DAGs和Operators结合起来,用户就可以创建各种复杂的 workflow了。
1.3 其它概念
- Connections: 管理外部系统的连接信息,如外部MySQL、HTTP服务等,连接信息包括
conn_id
/hostname
/login
/password
/schema
等,可以通过界面查看和管理,编排workflow时,使用conn_id
进行使用。 - Pools: 用来控制tasks执行的并行数。将一个task赋给一个指定的
pool
,并且指明priority_weight
,可以干涉tasks的执行顺序。 - XComs:在airflow中,operator一般(not always)是原子的,也就是说,他们一般独立执行,同时也不需要和其他operator共享信息,如果两个operators需要共享信息,如filename之类的, 推荐将这两个operators组合成一个operator。如果实在不能避免,则可以使用XComs (cross-communication)来实现。XComs用来在不同tasks之间交换信息。
- Trigger Rules:指task的触发条件。默认情况下是task的直接上游执行成功后开始执行,airflow允许更复杂的依赖设置,包括
all_success
(所有的父节点执行成功),all_failed
(所有父节点处于failed或upstream_failed状态),all_done
(所有父节点执行完成),one_failed
(一旦有一个父节点执行失败就触发,不必等所有父节点执行完成),one_success
(一旦有一个父节点执行成功就触发,不必等所有父节点执行完成),dummy
(依赖关系只是用来查看的,可以任意触发)。另外,airflow提供了depends_on_past
,设置为True时,只有上一次调度成功了,才可以触发。
2. 示例
先来看一个简单的DAG。图中每个节点表示一个task,所有tasks组成一个DAG,各个tasks之间的依赖关系可以根据节点之间的线看出来。
2.1 实例化DAG
# -*- coding: UTF-8 -*-
## 导入airflow需要的modules
from airflow import DAG
from datetime import datetime, timedelta
default_args = {
'owner': 'lxwei',
'depends_on_past': False, # 如上文依赖关系所示
'start_date': datetime(2018, 1, 17), # DAGs都有个参数start_date,表示调度器调度的起始时间
'email': ['lxwei@github.com'], # 用于alert
'email_on_failure': True,
'email_on_retry': False,
'retries': 3, # 重试策略
'retry_delay': timedelta(minutes=5)
}
dag = DAG('example-dag', default_args=default_args, schedule_interval='0 0 * * *')
在创建DAGs时,我们可以显示的给每个Task传递参数,但通过default_args,我们可以定义一个默认参数用于创建tasks。
注意,schedule_interval 跟官方文档不一致,官方文档的方式已经被deprecated。
2.2 定义依赖关系
这个依赖关系是我自己定义的,key表示某个taskId,value里的每个元素也表示一个taskId,其中,key依赖value里的所有task。
"dependencies": {
"goods_sale_2": ["goods_sale_1"], # goods_sale_2 依赖 goods_sale1
"shop_sale_1_2": ["shop_sale_1_1"],
"shop_sale_2_2": ["shop_sale_2_1"],
"shop_sale_2_3": ["shop_sale_2_2"],
"etl_task": ["shop_info", "shop_sale_2_3", "shop_sale_realtime_1", "goods_sale_2", "shop_sale_1_2"],
"goods_sale_1": ["timelySalesCheck", "productDaySalesCheck"],
"shop_sale_1_1": ["timelySalesCheck", "productDaySalesCheck"],
"shop_sale_realtime_1": ["timelySalesCheck", "productDaySalesCheck"],
"shop_sale_2_1": ["timelySalesCheck", "productDaySalesCheck"],
"shop_info": ["timelySalesCheck", "productDaySalesCheck"]
}
2.3 定义tasks和依赖关系
首先,实例化operators,构造tasks。如代码所示,其中,EtlTask
、MySQLToWebDataTransfer
、MySQLSelector
是自定义的三种Operator,根据taskType实例化operator,并存放到taskDict中,便于后期建立tasks之间的依赖关系。
for taskConf in tasksConfs:
taskType = taskConf.get("taskType")
if taskType == "etlTask":
task = EtlTask(
task_id=taskConf.get("taskId"),
httpConnId=httpConn,
etlId=taskConf.get("etlId"),
dag=dag)
taskDict[taskConf.get("taskId")] = task
elif taskType == "MySQLToWebDataTransfer":
task = MySqlToWebdataTransfer(
task_id = taskConf.get("taskId"),
sql= taskConf.get("sql"),
tableName=taskConf.get("tableName"),
mysqlConnId =mysqlConn,
httpConnId=httpConn,
dag=dag
)
taskDict[taskConf.get("taskId")] = task
elif taskType == "MySQLSelect":
task = StatusChecker(
task_id = taskConf.get("taskId"),
mysqlConnId = mysqlConn,
sql = taskConf.get("sql"),
dag = dag
)
taskDict[taskConf.get("taskId")] = task
else:
logging.error("error. TaskType is illegal.")
构建tasks之间的依赖关系,其中,dependencies中定义了上面的依赖关系,A >> B
表示A是B的父节点,相应的,A << B
表示A是B的子节点。
for sourceKey in dependencies:
destTask = taskDict.get(sourceKey)
sourceTaskKeys = dependencies.get(sourceKey)
for key in sourceTaskKeys:
sourceTask = taskDict.get(key)
if (sourceTask != None and destTask != None):
sourceTask >> destTask
3. 常用命令
命令行输入airflow -h
,得到帮助文档
backfill Run subsections of a DAG for a specified date range
list_tasks List the tasks within a DAG
clear Clear a set of task instance, as if they never ran
pause Pause a DAG
unpause Resume a paused DAG
trigger_dag Trigger a DAG run
pool CRUD operations on pools
variables CRUD operations on variables
kerberos Start a kerberos ticket renewer
render Render a task instance's template(s)
run Run a single task instance
initdb Initialize the metadata database
list_dags List all the DAGs
dag_state Get the status of a dag run
task_failed_deps Returns the unmet dependencies for a task instance
from the perspective of the scheduler. In other words,
why a task instance doesn't get scheduled and then
queued by the scheduler, and then run by an executor).
task_state Get the status of a task instance
serve_logs Serve logs generate by worker
test Test a task instance. This will run a task without
checking for dependencies or recording it's state in
the database.
webserver Start a Airflow webserver instance
resetdb Burn down and rebuild the metadata database
upgradedb Upgrade the metadata database to latest version
scheduler Start a scheduler instance
worker Start a Celery worker node
flower Start a Celery Flower
version Show the version
connections List/Add/Delete connections
其中,使用较多的是backfill、run、test、webserver、scheduler。其他操作在web界面操作更方便。另外,initdb 用于初始化metadata,使用一次即可;resetdb会重置metadata,清除掉数据(如connection数据), 需要慎用。
4. 问题
在使用airflow过程中,曾把DAGs里的task拆分得很细,这样的话,如果某个task失败,重跑的代价会比较低。但是,在实践中发现,tasks太多时,airflow在调度tasks会很低效,airflow一直处于选择待执行的task的过程中,会长时间没有具体task在执行,从而整体执行效率大幅降低。
5. 总结
airflow 很好很强大。如果只是简单的ETL之类的工作,可以很容易的编排。调度灵活,而且监控和报警系统完备,可以很方便的投入生产环节。
原文来自:http://lxwei.github.io/posts/airflow%E4%BB%8B%E7%BB%8D.html
airflow介绍的更多相关文章
- 任务调度工具 Apache Airflow 初识
参考文章: Apache Airflow (incubating) Documentation — Airflow ... 任务调度神器 airflow 之初体验 airflow 介绍 - 简书(原文 ...
- Airflow Python工作流引擎的重要概念介绍
Airflow Python工作流引擎的重要概念介绍 - watermelonbig的专栏 - CSDN博客https://blog.csdn.net/watermelonbig/article/de ...
- 灵活可扩展的工作流管理平台Airflow
1. 引言 Airflow是Airbnb开源的一个用Python写就的工作流管理平台(workflow management platform).在前一篇文章中,介绍了如何用Crontab管理数据流, ...
- 【原创】大数据基础之Ambari(3)通过Ambari部署Airflow
ambari2.7.3(hdp3.1) 安装 airflow1.10 ambari的hdp中原生不支持airflow安装,下面介绍如何通过mpack方式使ambari支持airflow安装: 1 下载 ...
- azkaban架构介绍
转自:https://blog.csdn.net/huoji1990/article/details/81911904 官网:https://azkaban.readthedocs.io/en/lat ...
- airflow docker
https://github.com/puckel/docker-airflow 镜像介绍:https://hub.docker.com/r/puckel/docker-airflow/ docker ...
- [AirFlow]AirFlow使用指南三 第一个DAG示例
经过前两篇文章的简单介绍之后,我们安装了自己的AirFlow以及简单了解了DAG的定义文件.现在我们要实现自己的一个DAG. 1. 启动Web服务器 使用如下命令启用: airflow webserv ...
- [AirFlow]AirFlow使用指南二 DAG定义文件
1. Example """ Code that goes along with the Airflow tutorial located at: https://git ...
- Airflow 调度基础
1. Airflow Airflow是一个调度.监控工作流的平台.用于将一个工作流制定为一组任务的有向无环图(DAG),并指派到一组计算节点上,根据相互之间的依赖关系,有序执行. 2. 安装 pip安 ...
随机推荐
- JsonResponse简单使用
一个简单的django项目 urlpatterns = [ # views.hello 是执行views中的hello函数 # name 是URL的别名 url(r'^hello/', views.h ...
- java分布式事务及解决方案
1.什么是分布式事务 分布式事务就是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上.以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成 ...
- SAP EXCEL OLE常用方法和属性
1.创建application: CREATE OBJECT excel 'EXCEL.APPLICATION'. 2.设置显示模式,为1前台运行,为0时表示为后台运行. . 3.设置为不弹消息框(在 ...
- java中instanceof的基本使用
java中的instanceof运算符是用于判断对象是否是指定类或这个指定类的子类的一个实例,返回值是布尔类型. 语法: boolean result = object instanceof clas ...
- TCP/IP中32位IP地址与字符串转化
转载:http://www.cnitblog.com/wujian-IT/archive/2007/10/11/34739.aspx 在网络上面我们用的IP都是数字加点(192.168.0.1)构成的 ...
- VM Centos 连不上网或者ping不通问题汇总
首先检查windows关于VM的服务有没有开启.没有开启的都开起来 通过复制形式建立的虚拟机,注意修改网卡地址.和cfg文件的UUID. 虚拟机ip能正常显示但是windows电脑ping不通虚拟机. ...
- 小米手机Toast带app名称
如果用小米手机做测试,会发现,Toast弹窗有可能会在前面带app名称.这是因为你传入的context是activity,如果是Application的话,就不会显示app名称.但是,我做测试时,一般 ...
- selenium 安装流程
安装 1.安装python 2.cmd中输入:pip install selenium 输入pip show selenium检查是否安装完成 3.下载chromedriver 在浏览器中输入chro ...
- ipcs查看消息队列命令
修改消息队列大小: root:用户: /etc/sysctl.conf kernel.msgmnb =4203520 #kernel.msgmnb =3520 kernel.msgmni = 2878 ...
- VBNET 文件信息和目录管理(判断,创建,删除,移动,复制)
1.判断文件/目录是否存在 Try ' 先判断文件是否存在. If Not File.Exists(TextBox4.Text) Then File.CreateText(TextBox4.Text) ...