airflow 是 apache下孵化项目,是纯 Python 编写的一款非常优雅的开源调度平台。github 上有 9161 个星,是非常受欢迎的调度工具。airflow 使用 DAG (有向无环图) 来定义工作流,配置作业依赖关系非常方便,豪不夸张地说:方便程度简直甩其他任务调度工具一条街。
airflow 有着以下天然优势:
极易扩展,提供各种基类供扩展, 还有多种执行器可供选择,其中 CeleryExcutor 使用了消息队列来编排多个工作节点(worker), 可分布式部署多个 worker ,airflow 可以做到无限扩展。
丰富的命令工具,你甚至都不用打开浏览器,直接在终端敲命令就能完成测试,部署,运行,清理,重跑,追数等任务,想想那些靠着在界面上不知道点击多少次才能部署一个小小的作业时,真觉得airflow 真的太友好了。
airflow 还是免费的,我们可以将一些常做的巡检任务,定时脚本(如 crontab ),ETL处理,监控等任务放在 airflow 上集中管理,甚至都不用再写监控脚本,作业出错会自动发送日志到指定人员邮箱,低成本高效率地解决生产问题。但是由于中文文档太少,大多不够全全,因此想快速上手并不十分容易。首先要具备一定的 Python 知识,反复阅读官方文档,理解调度原理。本系列分享由浅入深,逐步细化,尝试为你揭开 airflow 的面纱。
从一个使用者的角度来看,调度工作都有以下功能:
系统配置($AIRFLOW_HOME/airflow.cfg)
作业管理($AIRFLOW_HOME/dags/xxxx.py)
除了短信需要自己实现,其他功能 airflow 都有,而且在 airflow 的 webserver 上我们可以直接配置数据库连接来写 sql 查询,做更加灵活的统计分析。
除了以上的组成部分,我们还需要知道一些概念
Linux 的 crontab 和 windows 的任务计划,他们可以配置定时任务或间隔任务,但不能配置作业之前的依赖关系。airflow 中 DAG 就是管理作业依赖关系的。DAG 的英文 directed acyclic graphs 即有向无环图,下图 1 便是一个简单的 DAG
DAG 定义一个作业流,Operators 则定义了实际需要执行的作业。airflow 提供了许多 Operators 来指定我们需要执行的作业:
除了以上这些 Operators 还可以方便的自定义 Operators 满足个性化的任务需求。
airflow 1.9 之前的版本使用本地时区来定义任务开始日期,scheduler_interval 中 crontab 表达式中的定时也是依据本地时区为准,但 airflow 1.9 及后续新版本将默认使用 UTC 时区来确保 airflow 调度的独立性,以避免不同机器使用不同时区导致运行错乱。如果调度的任务集中在一个时区上,或不同机器,但使用同一时区时,需要对任务的开始时间及 cron 表达式进行时区转换,或直接使用本地时区。目前 1.9 的稳定版本还不支持时区配置,后续版本会加入时区配置,以满足使用本地时区的需求。
webserver 是 airflow 的界面展示,可显示 DAG 视图,控制作业的启停,清除作业状态重跑,数据统计,查看日志,管理用户及数据连接等。不运行 webserver 并不影响 airflow 作业的调度。
调度器 schduler 负责读取 DAG 文件,计算其调度时间,当满足触发条件时则开启一个执行器的实例来运行相应的作业,必须持续运行,不运行则作业不会跑批。
当执行器为 CeleryExecutor 时,需要开启一个 worker。
执行器有 SequentialExecutor, LocalExecutor, CeleryExecutor