airflow搭建分布式流程控制
Airflow是一个可编程,调度和监控的工作流平台,基于有向无环图(DAG),airflow可以定义一组有依赖的任务,按照依赖依次执行。airflow提供了丰富的命令行工具用于系统管控,而其web管理界面同样也可以方便的管控调度任务,并且对任务运行状态进行实时监控,方便了系统的运维和管理。
Airflow的工作流程
airflow 的守护进程彼此之间是独立的,他们并不相互依赖,也不相互感知。每个守护进程在运行时只处理分配到自己身上的任务,他们在一起运行时,提供了 airflow 的全部功能。
-
调度器 scheduler 会间隔性的去轮询元数据库(Metastore)已注册的 DAG(有向无环图,可理解为作业流)是否需要被执行。如果一个具体的 DAG 根据其调度计划需要被执行,scheduler 守护进程就会先在元数据库创建一个 DagRun 的实例,并触发 DAG 内部的具体 task(任务,可以这样理解:DAG 包含一个或多个task),触发其实并不是真正的去执行任务,而是推送 task 消息至消息队列(即 broker)中,每一个 task 消息都包含此 task 的 DAG ID,task ID,及具体需要被执行的函数。如果 task 是要执行 bash 脚本,那么 task 消息还会包含 bash 脚本的代码。
-
用户可能在 webserver 上来控制 DAG,比如手动触发一个 DAG 去执行。当用户这样做的时候,一个DagRun 的实例将在元数据库被创建,scheduler 使同 #1 一样的方法去触发 DAG 中具体的 task
-
worker 守护进程将会监听消息队列,如果有消息就从消息队列中取出消息,当取出任务消息时,它会更新元数据中的 DagRun 实例的状态为正在运行,并尝试执行 DAG 中的 task,如果 DAG 执行成功,则更新任 DagRun 实例的状态为成功,否则更新状态为失败。
airflow 单节点部署
以所有上守护进程运行在同一台机器上即可完成 airflow 的单结点部署,架构如下图所示:
##Airflow多节点(集群)部署
在稳定性要求较高的场景,一般采用集群、高可用的方式来部署。Apache Airflow 同样支持集群、高可用的部署,airflow 的守护进程可分布在多台机器上运行,架构如下图所示:
以上内容引自于:https://www.jianshu.com/p/2ecef979c606
Airflow安装与部署
安装环境
- centos 7.2
- Airflow 1.9
- Python 2.7.5
- Celery 4.3.0
- Redis 4.1.0
- Mysql 5.7
Airflow1.9要求Celery4.X,而且兼容性需要Redis4.X
安装过程
1. 安装准备
新建用户
groupadd airflow
useradd airflow -g airflow
默认自带python2环境,自行安装pip; 安装pip,并进行升级,不然会报错
yum -y install epel-release
yum install python-pip
pip install --upgrade pip
pip install --upgrade setuptools
1.安装开发库
yum install python-devel
yum install libevent-devel
yum install mysql-devel
yum install gcc
安装的过程可能会出现markupsafe的问题,需要对其进行写在重装
sudo pip uninstall markupsafe
sudo pip install markupsafe
2.Airflow安装
1)在此之前需要设定临时环境变量
export SLUGIFY_USES_TEXT_UNIDECODE=yes
pip install apache-airflow==1.9
2)安装airflow-mysql
pip install apache-airflow[mysql]==1.9
3)修改配置文件
airflow安装完成之后,默认在用户根目录下,产生airflow目录
vim ~/airflow/airflow.cfg
sql_alchemy_conn = sqlite:root/airflow/airflow.db
替换为
sql_alchemy_conn = mysql://root:Admin@ads1111@127.0.0.1:3306/airflow
4)执行数据库初始化
airflow initdb
配置CeleryExecutor
1)安装redis==4.0.6
wget http://download.redis.io/releases/redis-4.0.6.tar.gz
tar -zxvf redis-4.0.6.tar.gz
cd redis-4.0.6
make MALLOC=libc
cd src && make install
或者
yum -y install redis==4.0.6
2)修改配置文件
vim /etc/redis.conf
#bind 127.0.0.1 // 注释掉,使redis允许远程访问
requirepass 密码 // 修改这行,redis登录密码
3)开启redis服务
编译安装的话:./redis-server /usr/local/redis-4.0.6/redis.conf
yum安装的话:systemctl start redis
4)python下安装redis库
pip install redis
pip install apache-airflow[redis]==1.9
pip install -U Celery==4.3.0
pip install apache-airflow[celery]==1.9
5)修改airflow.cfg配置文件
更改exector
# SequentialExecutor, LocalExecutor, CeleryExecutor, DaskExecutor
executor = CeleryExecutor
更改broker_url 和celery_result_backend
#broker_url = sqla+mysql://airflow:airflow@localhost:3306/airflow
broker_url = redis://127.0.0.1:6379/0
# Another key Celery setting
celery_result_backend = db+mysql://root:Admin@ads1111@127.0.0.1:3306/airflow
Airflow开启执行
airflow webserver -p 8080 开启webserver
airflow scheduler 开启调度
airflow worker 开启消费者进程 注意:这需要使用非root账号执行,如果需要root执行,需要进行配置,配置见下方
webserver启动成功
scheduler启动成功
worker启动成功
安装过程中出现的问题
- airflow initdb 时报错
出现异常:Exception: Global variable explicit_defaults_for_timestamp needs to be on (1) for mysql
解决方式:修改mysql的配置文件 my.cnf,添加
- airflow worker (非root用户执行)
TypeError: Invalid argument(s) 'visibility_timeout' sent to create engine(), using configuration MySQLDialect_mysqldb/QueuePool/Engine. Please check that the keyword arguments are appropriate for this combination of components.
由于使用的非root用户,执行的时候会在home读取该用户根目录下的airflow的配置,并非root之前的配置好的airflow.cfg,相当于读取的是默认的配置,所以需要在非用户的根目录下,配置和root用户一行的配置才行。而且要保证非root用户和root用户的dag路径一致,否则将导致,非root用户执行的时候,找不到dag文件
- 无法使用root用户启动worker
1)修改源码,(该方法不推荐线上使用)
/usr/lib/python2.7/site-packages/airflow/executors,修改celery_executor.py源码文件
头部导入
from celery import Celery, platforms
在app = Celery(…)后新增
platforms.C_FORCE_ROOT = True
2)添加环境变量
C_FORCE_ROOT = True
vim /etc/profile
最后添加
export C_FORCE_ROOT=True
执行:source /etc/profile
未完,待续…