什么是 Airflow
Airflow 是一个使用 Python 语言编写的 Data Pipeline 调度和监控工作流的平台。Airflow 是通过 DAG(Directed Acyclic Graph 有向无环图)来管理任务流程的任务调度工具,不需要知道业务数据的具体内容,设置任务的依赖关系即可实现任务调度。
这个平台拥有和 Hive、Presto、MySQL、HDFS、Postgres 等数据源之间交互的能力,并且提供了钩子(Hook)使其拥有很好地扩展性。除了一个命令行界面,该工具还提供了一个基于 Web 的用户界面可以可视化管道的依赖关系、监控进度、触发任务等。
Airflow 特点
- 可编程:使用 Python 语言进行编写,支持自定义操作和扩展。
- 可扩展:支持通过插件扩展功能。
- 可调度:可以在指定时间运行任务,支持依赖性和优先级调度。
- 可监控:提供丰富的监控和日志记录功能,方便用户监控任务执行状态和调试问题。
- 可视化:提供 Web 界面来可视化任务和工作流程的状态和进度。
Airflow 的架构
在一个可扩展的生产环境中,Airflow 含有以下组件:
元数据库:这个数据库存储有关任务状态的信息调度器:Scheduler 是一种使用 DAG 定义结合元数据中的任务状态来决定哪些任务需要被执行以及任务执行优先级的过程。调度器通常作为服务运行执行器:Executor 是一个消息队列进程,它被绑定到调度器中,用于确定实际执行每个任务计划的工作进程。有不同类型的执行器,每个执行器都使用一个指定工作进程的类来执行任务。例如,LocalExecutor 使用与调度器进程在同一台机器上运行的并行进程执行任务。其他像 CeleryExecutor 的执行器使用存在于独立的工作机器集群中的工作进程执行任务Workers:这些是实际执行任务逻辑的进程,由正在使用的执行器确定
Airflow 解决哪些问题
通常,在一个运维系统,数据分析系统,或测试系统等大型系统中,我们会有各种各样的依赖需求。包括但不限于:
- 时间依赖:任务需要等待某一个时间点触发
- 外部系统依赖:任务依赖外部系统需要调用接口去访问
- 任务间依赖:任务 A 需要在任务 B 完成后启动,两个任务互相间会产生影响
- 资源环境依赖:任务消耗资源非常多,或者只能在特定的机器上执行
Crontab 可以很好地处理定时执行任务的需求,但仅能管理时间上的依赖。
Airflow 的核心概念是 DAG(有向无环图)。DAG 由一个或多个 Task 组成,而这个 DAG 正是解决了上文所说任务间的依赖问题。任务执行的先后依赖顺序、多个 Task 之间的依赖关系可以很好的用 DAG 表示完善。
Airflow 同样完整的支持 Crontab 表达式,也支持直接使用 Python 的 datatime 模块表述时间,还可以用 datatime 的 delta 表述时间差。
Airflow 名词
- Dynamic:Airflow 配置需要使用 Python,允许动态生产管道。这允许编写可动态实例化管道的代码
- Extensible:轻松定义自己的运算符,执行程序并扩展库,使其适合于您的环境
- Elegant:Airlfow 是精简的,使用功能强大的 Jinja 模板引擎,将脚本参数化内置于 Airflow 的核心中
- Scalable:Airflow 具有模板块架构,并使用消息队列来安排任意数量的工作任务。