Airflow简介
- Airflow将一个工作流制定为一组任务的有向无环图(DAG),并指派到一组计算节点上,根据相互之间的依赖关系,有序执行。
- Airflow 有以下优势:
- 灵活易用。Airflow 是 Python 编写的,工作流的定义也使用 Python 编写;
- 功能强大。支持多种不同类型的作业,可自定义不同类型的作业。如 Shell、Python、Mysql、Oracle、Hive等;
- 作业的定义简单明了;
- 易扩展。提供各种基类供扩展,有多种执行器可供选择;
Airflow体系架构
- Webserver 守护进程。接受 HTTP 请求,通过 Python Flask Web 应用程序与airflow 进行交互。Webserver 提供功能的功能包括:中止、恢复、触发任务;监控正在运行的任务,断点续跑任务;查询任务的状态,日志等详细信息。
- Scheduler 守护进程。周期性地轮询任务的调度计划,以确定是否触发任务执行。
- Worker 守护进程。Worker负责启动机器上的executor来执行任务。使用celeryExecutor后可以在多个机器上部署worker服务。
Airflow重要概念
-
DAG(Directed Acyclic Graph)有向无环图:
- 在Airflow中,一个DAG定义了一个完整的作业。同一个DAG中的所有Task拥有相同的调度时间。
- 参数:
- dag_id:唯一识别DAG
- default_args:默认参数,如果当前DAG实例的作业没有配置相应参数,则采用DAG实例的default_args中的相应参数
- schedule_interval:配置DAG的执行周期,可采用crontab语法
-
Task为DAG中具体的作业任务
- Task依赖于DAG,必须存在于某个DAG中。Task在DAG中可以配置依赖关系
- 参数:
- dag:当前作业属于相应DAG
- task_id:任务标识符
- owner:任务的拥有者
- start_date:任务的开始时间
crontab简介
- Linux 系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。
- Linux 系统也提供了Linux用户控制计划任务的命令:crontab 命令。
生成crontab表达式的网站【https://www.bejson.com/othertools/cron/】
1. * 代表所有的取值范围内的数字。如月份字段为*,则表示1到12个月;
2. / 代表每一定时间间隔的意思。如分钟字段为*/10,表示每10分钟执行1次;
3. - 代表从某个区间范围,是闭区间。如2-5表示2,3,4,5,小时字段中0-23/2表示在0~23点范围内每2个小时执行一次;
4. , 分散的数字(不连续)。如1,2,3,4,7,9;
Airflow核心
- DAGs:有向无环图(Directed Acyclic Graph),将所有需要运行的tasks按照依赖关系组织起来,描述的是所有tasks执行的顺序;
- Operators:Airflow内置了很多operators
- BashOperator 执行一个bash 命令
- PythonOperator 调用任意的 Python 函数
- EmailOperator 用于发送邮件
- HTTPOperator 用于发送HTTP请求
- SqlOperator 用于执行SQL命令
- 自定义Operator
- Tasks:Task 是 Operator的一个实例;
- Task Instance:由于Task会被重复调度,每次task的运行就是不同的 Task instance。Task instance 有自己的状态,包括 success 、 running 、failed 、 skipped 、 up_for_reschedule 、 up_for_retry 、 queued 、no_status 等;
- Task Relationships:DAGs中的不同Tasks之间可以有依赖关系;
- 执行器(Executor)。Airflow支持的执行器就有四种:
- SequentialExecutor:单进程顺序执行任务,默认执行器,通常只用于测试
- LocalExecutor:多进程本地执行任务
- CeleryExecutor:分布式调度,生产常用。Celery是一个分布式调度框架,其本身无队列功能,需要使用第三方组件,如RabbitMQ
- DaskExecutor :动态任务调度,主要用于数据分析