调度工具Airflow

1. 什么是Airflow

 Airflow是Airbnb开源的data pipeline调度和监控工作流的平台,用于用来创建、监控和调整data pipeline(ETL)。

2. 简单的定时任务cron

 假设我们想要定时调用一个程序,比如说:每天定时从Web抓数据,我们可以使用cron。cron是一个Linux下的后台服务,用来定期的执行一些任务,在/etc/crontab中设置后即可,基本写法如下:

# 分钟 小时 日 月 周 用户  命令 
17 * * * * root date >> /tmp/time.log 

 它的意思是每个小时的第18分钟,将当前时间写入log文件,注意各值的取值范围(分钟 0 - 59,小时0 - 23,天1 - 31,月1 - 12,星期0 - 6,0表示星期天) 修改/etc/crontab后,还需要用 $ sudo service cron restart命令重启crontab任务,才能生效。

3. 为什么要用Airflow

 有了cron为什么还需要airflow?以抓取web数据为例,可能在某天抓取数据时,网断或者关机了,当天的数据没抓进来,这种情况下,只能通过写日志定时分析日志,以及在程序中定时重连的方式保证数据完整,相对比较零碎和麻烦。另外,如果crontab设置文件中有几十上百条任务时,就比较头疼了。

 Airflow支持图形界面和命令行两种方式,管理起来比较方便,另外,它可以把几个相互依赖的任务编成一组,并监督执行是否正常,如果不正常,调用程序重试等等。

 当然,Airflow也不全是优点,比如需要使用python脚本来定义任务间的依赖关系,相对于手动编辑crontab文件,相对难一些。因此,如果只调用简单的任务,使用cron即可,复杂的再考虑airflow。

4. Airflow的基础概念

 Airflow 中最基本的两个概念是:DAG 和 task。DAG 的全称是 Directed Acyclic Graph 是所有你想执行的任务的集合,在这个集合中可以定义了他们的依赖关系,一个 DAG object可以用 Python 脚本中配置完成。每个 DAG object 代表了一个 workflow,每个 workflow 都可以包含任意个 task,task就是具体的任务。

5. Airflow安装和使用

(1) 安装airflow

$ sudo pip install airflow 

 可以通过环境变量AIRFLOW_HOME 设置airflow的工作目录,默认为$HOME/airflow/

(2) Mysql支持

 如果想使用mysql存储airflow内容,请按如下方法设置mysql;如果不设置,airflow在其工作目录下建立db文件,以sqlite方式存储。

$ mysql -u root -p

mysql> create database airflow default charset utf8 collate utf8_general_ci;
mysql> create user airflow@'localhost' identified by 'airflow';
mysql> grant all on airflow.* to airflow@'localhost';
mysql> flush privileges;

 修改配置文件 $AIRFLOW_HOME/airflow.cfg,把sql_alchemy_conn对应语句替换成:

sql_alchemy_conn = mysql://airflow:airflow@localhost:3306/airflow

(3) 运行

$ airflow initdb
$ airflow worker
$ airflow webserver -p 8080 # 一直运行
$ airflow scheduler # 一直运行  

 此时在浏览器中输入:http://localhost:8080,即可看到airflow界面,其中有很多demo可以参考。

(4) 建立第一个DAG:Hellow world

$ mkdir $AIRFLOW_HOME/dags/
$ vi $AIRFLOW_HOME/dags/hello_word.py # 内容如下:
 # -*- coding: utf-8 -*-

import airflow
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.python_operator import PythonOperator
from datetime import timedelta

default_args = {
 'owner': 'yan.xie',
 'depends_on_past': False,
 'start_date': airflow.utils.dates.days_ago(2),
 'retries': 5, # 重试次数
 'retry_delay': timedelta(minutes=1), # 运行间隔时间
}

dag = DAG(
 'test_my_dag', # DAG名字
 default_args=default_args,
 description='my first DAG',
 schedule_interval=timedelta(days=1))

task1 = BashOperator(
 task_id='task_1', # TASK名
 bash_command='date', # 运行命令
 dag=dag)

task2 = BashOperator(
 task_id='task_2',
 depends_on_past=False,
 bash_command='sleep 5',
 dag=dag)

def print_hello():
 return 'Hello world!'

test3 = PythonOperator(
 task_id='task_3',
 python_callable=print_hello, # 运行python程序
 dag=dag)

task2.set_upstream(task1) # 设置依赖关系
test3.set_upstream(task1) 

 保存之后,再浏览器刷新一下界面,即可在list中看到该DAG,点On后,即可运行。

 点开DAG可以看到各Task间的依赖关系

 以及树型关系

(5) 调试
 有时候,怕不能一次写对,可以运行以下命令调试单个Task

$ airflow test test_my_dag task_3 20181027

(6) 清除全部DAG重置数据库

$ airflow resetdb 

 并删除 $AIRFLOW_HOME/dags/ 下所有DAG文件,然后重启webserver。

 在Airflow中,如果改了一个DAG的名字,它会新建一个DAG,而不仅是改名,所以旧的DAG还在数据库和列表中存在,可以用 “$ airflow delete_dag DAG名” 的方式删除它,但不是每个airflow版本都支持delete_dag命令。此时可以只用resetdb不删除dags目录下文件的方式,删除目录中没有对应文件的DAG(删除有风险,操作须谨慎)。

6. 参考

(1) Ubuntu下crontab命令的用法
https://www.cnblogs.com/daxian2012/articles/2589894.html

(2) 使用 Airflow 替代你的 crontab
https://www.juhe.cn/news/index/id/2365

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 本文将介绍 Airflow 这一款优秀的调度工具。主要包括 Airflow 的服务构成、Airflow 的 Web...
    a7f00a9019ae阅读 61,061评论 6 42
  • Linux 系统提供了使用者控制计划任务的命令 :crontab 命令。 一、crond简介 crond是linu...
    happeace阅读 1,712评论 0 53
  • linux 系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性...
    苏大发阅读 629评论 0 0
  • “这个世界太多被迫,然鹅,最无奈的是太多时候都成了那时候。那时候的事,不如我们,一起怀念” 那时候还理解不了那个年...
    一撇_祁小柒阅读 262评论 0 0
  • 2008年5.12日,记得很清楚!初二一个很平常的午后,刚午睡小憩醒来,是练习英语听力的时间,英语老师陈老师急匆匆...
    笑响点亮了四面wind阅读 118评论 0 0