AirFlow简介
1, 简介
Airflow是一个可编程,调度和监控的工作流平台,基于有向无环图(DAG),airflow可以定义一组有依赖的任务,按照依赖依次执行。airflow提供了丰富的命令行工具用于系统管控,而其web管理界面同样也可以方便的管控调度任务,并且对任务运行状态进行实时监控,方便了系统的运维和管理。
2,执行器(Executor)
Airflow本身是一个综合平台,它兼容多种组件,所以在使用的时候有多种方案可以选择。比如最关键的执行器就有四种选择:
SequentialExecutor:单进程顺序执行任务,默认执行器,通常只用于测试
LocalExecutor:多进程本地执行任务
CeleryExecutor:分布式调度,生产常用
DaskExecutor :动态任务调度,主要用于数据分析
在当前项目使用CeleryExecutor
作为执行器。
celery是一个分布式调度框架,其本身无队列功能,需要使用第三方组件,比如redis或者rabbitmq,当前项目使用的是rabbitmq,系统整体结构如下所示:
其中:
turing为外部系统
GDags服务帮助拼接成dag
master节点webui管理dags、日志等信息
scheduler负责调度,只支持单节点
worker负责执行具体dag中的task, worker支持多节点
在整个调度系统中,节点之间的传递介质是消息,而消息的本质内容是执行脚本的命令,也就是说,工作节点的dag文件必须和master节点的dag文件保持一致,不然任务的执行会出问题。
3,任务处理器
airflow内置了丰富的任务处理器,用于实现不同类型的任务:
BashOperator : 执行bash命令
PythonOperator : 调用python代码
EmailOperator : 发送邮件
HTTPOperator : 发送 HTTP 请求
SqlOperator : 执行 SQL 命令
除了这些基本的构建块之外,还有更多的特定处理器:DockerOperator
,HiveOperator
,S3FileTransferOperator
,PrestoToMysqlOperator
,SlackOperator
...
在当前项目使用了HTTPOperator
作为执行器,用于调用JAVA服务,整体结构图如下:
关于airflow的环境搭建可以参考另外一篇博客: https://www.cnblogs.com/cord/p/9226608.html
4,基本使用
4.1,常用命令
$ airflow webserver -D 守护进程运行webserver
$ airflow scheduler -D 守护进程运行调度器
$ airflow worker -D 守护进程运行调度器
$ airflow worker -c 1 -D 守护进程运行celery worker并指定任务并发数为1
$ airflow pause dag_id 暂停任务
$ airflow unpause dag_id 取消暂停,等同于在管理界面打开off按钮
$ airflow list_tasks dag_id 查看task列表
$ airflow clear dag_id 清空任务实例
$ airflow trigger_dag dag_id -r RUN_ID -e EXEC_DATE 运行整个dag文件
$ airflow run dag_id task_id execution_date 运行task
4.2,web管控界面的使用
启动web管控界面需要执行airflow webserver -D
命令,默认访问端口是8080
http://110.55.63.51:8080/admin/
(1) 任务启动暂停开关
(2) 任务运行状态
(3) 待执行,未分发的任务
(4) 手动触发执行任务
(5) 任务管控界面
选择对应dag栏目,点击(5) Graph View即可进入任务管控界面
点击对应的任务,会弹出一个任务管控台,主要几个功能如下:
View Log : 查看任务日志
Run : 运行选中任务
Clear:清空任务队列
Mark Success : 标记任务为成功状态
4.3 通过定义DAG文件实现创建定时任务
1) 普通任务
from datetime import timedelta, datetime
import airflow
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.dummy_operator import DummyOperator
default_args = { #默认参数
'owner': 'jifeng.si', #dag拥有者,用于权限管控
'depends_on_past': False, #是否依赖上游任务
'start_date': datetime(2018, 5, 2), #任务开始时间,默认utc时间
'email': ['123456789@qq.com'], #告警通知邮箱地址
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5),
}
dag = DAG(
'example_hello_world_dag', #dag的id
default_args=default_args,
description='my first DAG', #描述
schedule_interval='*/25 * * * *', # crontab
start_date=datetime(2018, 5, 28) #开始时间,覆盖默认参数
)
def print_hello():
return 'Hello world!'
dummy_operator = DummyOperator(task_id='dummy_task', dag=dag)
hello_operator = BashOperator( #通过BashOperator定义执行bash命令的任务
task_id='sleep_task',
depends_on_past=False,
bash_command='echo `date` >> /home/py/test.txt',
dag=dag
)
dummy_operator >> hello_operator #设置任务依赖关系
#dummy_operator.set_downstream(hello_operator)
2) 定义http任务并使用本地时间
import os
from datetime import timedelta, datetime
import pytz
from airflow.operators.http_operator import SimpleHttpOperator
from airflow.models import DAG
default_args = {
'owner': 'cord',
# 'depends_on_past': False,
'depends_on_past': True,
'wait_for_downstream': True,
'execution_timeout': timedelta(minutes=3),
'email': ['123456789@qq.com'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5),
}
#将本地时间转换为utc时间,再设置为start_date
tz = pytz.timezone('Asia/Shanghai')
dt = datetime(2018, 7, 26, 12, 20, tzinfo=tz)
utc_dt = dt.astimezone(pytz.utc).replace(tzinfo=None)
os.environ['AIRFLOW_CONN_HTTP_TEST']='http://localhost:9090'
dag = DAG(
'bm01',
default_args=default_args,
description='my DAG',
schedule_interval='*/2 * * * *',
start_date=utc_dt
)
#通过SimpleHttpOperator定义http任务
task1 = SimpleHttpOperator(
task_id='get_op1',
http_conn_id='http_test',
method='GET',
endpoint='test1',
data={},
headers={},
dag=dag)
task2 = SimpleHttpOperator(
task_id='get_op2',
http_conn_id='http_test',
method='GET',
endpoint='test2',
data={},
headers={},
dag=dag)
task1 >> task2
4.4 crontab语法
crontab
格式如下所示:
# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │ 7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * command to execute
域 | 是否必须 | 取值范围 | 可用特殊符号 | 备注 |
---|---|---|---|---|
Minutes | Yes | 0–59 | * , - |
|
Hours | Yes | 0–23 | * , - |
|
Day of month | Yes | 1–31 | * , - ? L W |
? L W 部分实现可用 |
Month | Yes | 1–12 or JAN–DEC | * , - |
|
Day of week | Yes | 0–6 or SUN–SAT | * , - ? L # |
? L W 部分实现可用 |
Year | No | 1970–2099 | * , - |
标准实现里无这一项 |
特殊符号功能说明:
逗号(,
)
逗号用于分隔一个列表里的元素,比如 "MON,WED,FRI" 在第五域(day of week)表示Mondays, Wednesdays and Fridays。
连字符(-
)
连字符用于表示范围,比如2000–2010表示2000到2010之间的每年,包括这两年(闭区间)。
百分号(%
)
用于命令(command)中的格式化
L
表示last
,最后一个,比如第五域,5L
表示当月最后一个星期五
W
W
表示weekday(Monday-Friday),指离指定日期附近的工作日,比如第三域设置为15L
,这表示临近当月15附近的工作日,假如15号是星期六,那么定时器会在14号执行,如果15号是星期天,那么定时器会在16号执行,也就是说只会在离指定日期最近的那天执行。
井号#
#
用于第五域(day of week),#后面跟着一个1~5之间的数字,这个用于表示第几个星期,比如5#3
表示第三个星期五
?
在有些实现里面,?
与*
的功能相同,还有一些实现里面?
表示cron的启动时间,比如 当cron服务在8:25am启动,则? ? * * * *
会更新为25 8 * * * *
, 直到下一次cron服务重新启动,定时器会再次更新。
/
/
一般与*
组合使用,后面跟着一个数字,表示频率,比如在第一域(Minutes)中*/5
表示每5分钟,是普通列表表示5,10,15,20,25,30,35,40,45,50,55,00的缩写
参考链接:
https://segmentfault.com/a/1190000012803744?utm_source=tuicool&utm_medium=referral
https://en.wikipedia.org/wiki/Cron
AirFlow简介的更多相关文章
- 【原创】Airflow 简介&如何部署一个健壮的 apache-airflow 调度系统
声明 本文摘录了很多前辈的文章,原文如下: https://www.jianshu.com/p/2ecef979c606 Airflow 简介 Airflow是一个可编程,调度和监控的工作流平台,基于 ...
- airflow 简介
转载:https://zhuanlan.zhihu.com/p/36043468 简介 Apache-Airflow 是Airbnb开源的一款数据流程工具,目前是Apache孵化项目.以非常灵活的方式 ...
- 3.Airflow使用
1. airflow简介2. 相关概念2.1 服务进程2.1.1. web server2.1.2. scheduler2.1.3. worker2.1.4. celery flower2.2 相关概 ...
- 【原创】大数据基础之Airflow(1)简介、安装、使用
airflow 1.10.0 官方:http://airflow.apache.org/ 一 简介 Airflow is a platform to programmatically author, ...
- 2.airflow参数简介
比较重要的参数: 参数 默认值 说明 airflow_home /home/airflow/airflow01 airflow home,由环境变量$AIRFLOW_HOME决定 dags_folde ...
- Airflow 使用简介
- 【airflow实战系列】 基于 python 的调度和监控工作流的平台
简介 airflow 是一个使用python语言编写的data pipeline调度和监控工作流的平台.Airflow被Airbnb内部用来创建.监控和调整数据管道.任何工作流都可以在这个使用Pyth ...
- ASP.NET Core 1.1 简介
ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...
- MVVM模式和在WPF中的实现(一)MVVM模式简介
MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...
随机推荐
- 5 X 5 方阵引出的寻路算法 之 路径遍历(完结)
此篇文章源自对一个有趣问题的思考,在我的另一篇博文<一个有趣的 5 X 5 方阵一笔画问题>中有详细介绍.在已知其结论的情况下,作为程序员的我,还是想利用该问题当做出发点,写一个可以遍 ...
- DC-2靶机渗透
靶场下载链接: Download: http://www.five86.com/downloads/DC-2.zip Download (Mirror): https://download.vulnh ...
- net必问的面试题系列之基本概念和语法
上个月离职了,这几天整理了一些常见的面试题,整理成一个系列给大家分享一下,机会是给有准备的人,面试造火箭,工作拧螺丝,不慌,共勉. 1.net必问的面试题系列之基本概念和语法 2.net必问的面试题系 ...
- SpringMVC源码分析4:DispatcherServlet如何找到正确的Controller
SpringMVC是目前主流的Web MVC框架之一. 我们使用浏览器通过地址 http://ip:port/contextPath/path进行访问,SpringMVC是如何得知用户到底是访问哪个 ...
- JavaScript中一个方法同时发送两个ajax请求问题
今天在做项目中遇到一个问题,大概是在一个jsp页面同时有一个select下拉搜索条件框和一个Bootstrap表格展示列表.这两个都要通过ajax向后台拿数据,而且要在页面加载时完成.当时的做法是: ...
- win7 部署tomcat
1,下载 jdk:http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u3-download-1501626.html 2,下载t ...
- 记:使用vue全家桶 + vux组件库 打包成 dcloud 5+ app 开发过程中遇到的问题
vue-cli 版本:2.9.6 webpack 版本:3.6.0 1. vue-cli 安装好之后,不是自动打开默认浏览器 在 config文件夹 ---> dev选项中,有个 autoO ...
- Flink中watermark为什么选择最小一条(源码分析)
昨天在社区群看到有人问,为什么水印取最小的一条?这里分享一下自己的理解 首先水印一般是设置为:(事件时间 - 指定的值) 这里的作用是解决迟到数据的问题,从源码来看一下它如何解决的 先来看下wind ...
- vector function trmplate
/* vector function template programmer:qpz */ #include <iostream> #include <vector> #def ...
- 蓝桥杯单片机CT107D 01 底层驱动基础
代码下载 https://share.weiyun.com/5NHvLxG 这两个代码文件是其他底层驱动代码的基础: 包含了控制138573(间接控制数码管led和蜂鸣器等).delay延时函数.CT ...