1 Airflow 安装流程
1.1 环境准备
1.1.1 数据库需求
mysql 8 (airflow scheduler 高可用需要 mysql8行锁特性)
redis (作为celery broker,无法使用集群,用哨兵做高可用)
1.1.2 安装 miniconda 虚拟环境(python3.8)
sudo ln -s /opt/miniconda3/condabin/conda /usr/bin/conda
sudo wget https://repo.anaconda.com/miniconda/Miniconda3-py38_4.9.2-Linux-x86_64.sh
sudo sh Miniconda3-py38_4.9.2-Linux-x86_64.sh
# 更换安装目录为/opt/miniconda3
See also https://docs.conda.io/en/latest/miniconda.html#linux-installers
1.1.3 安装依赖
sudo yum install python-devel mysql-devel
1.1.4 创建服务conda环境
sudo su - work
conda init bash
exec bash # restart shell
conda create --name airflow --clone base
conda activate airflow
1.1.5 mysql airflow 后台配置
CREATE DATABASE airflow CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SET explicit_defaults_for_timestamp=1;
1.2 airflow安装
1.2.1 安装airflow
vim ~/.bashrc
export AIRFLOW_HOME=/work/airflow
export PATH=$PATH:/home/sdev/.local/bin
source ~/.bashrc
pip install apache-airflow==2.1.2 --constraint https://raw.githubusercontent.com/apache/airflow/constraints-2.1.2/constraints-3.8.txt
1.2.2 安装python 依赖包
可以根据 dag的需求 写一个 requirements.txt 做版本依赖管理
要注意airflow 依赖包的版本冲突
尤其是以下包
redis
redis-py-cluster
SQLAlchemy
pip install --upgrade -r requirements.txt
1.2.3 airflow 数据初始化(如果已经初始化过,可以跳过)
airflow db init
1.2.4 airflow 创建用户 (admin:your-password)
airflow users create \
--username admin \
--firstname air \
--lastname flow \
--role Admin \
--email [email protected]
1.2.5 修改 airflow 配置文件(第一次修改数据库后端,需要重新 执行 1.2.3)
vim /work/airflow/airflow.cfg
airflow 生产配置
# dag 所在文件夹
dags_folder = /work/airflow/dags
# 调度执行
executor = CeleryExecutor
# mysql后端配置
sql_alchemy_conn = mysql+mysqldb://user:your-password@host:3306/airflow
# broker 配置 redis
broker_url = redis://host:6379/0
# 执行任务结果数据库后端
result_backend = db+mysql://user:your-password@host:3306/airflow
# celery flower监控 鉴权
flower_basic_auth = flower-user:your-password
# 不显示 用例 DAG
load_examples = False
#配置webserver 基础路径,如果不配置,日志会访问localhost
base_url = https://airflow-xxxx-xxxx.com/
#配置secret_key,多个节点secret_key需要一样,否则跨节点访问接口会403
secret_key = abkjdhlfkjhlsjnfl
#配置日志文件所在位置
base_log_folder = /work/airflow/logs
#打开远程日志
remote_logging = True
#日志格式配置为json
json_format = True
2 Airflow dag发布, 生产环境启动
2.1 airflow 生产环境简述
服务器 | 服务 |
---|---|
master1 | airflow webserver |
master2 | airflow webserver |
flower | airflow celery flower |
scheduler 1 | airflow scheduler |
scheduler 2 | airflow scheduler |
worker 1 | airflow celery worker |
worker 2 | airflow celery worker |
2.2 supervisor 配置
复制 代码项目下 ./resources/supervisord.d/ 到 /etc/supervisord.d/
eg: airflow worker 配置文件
[program:airflow-worker]
environment=PATH="/home/sdev/.conda/envs/airflow/bin:/opt/miniconda3/condabin:/sbin:/bin:/usr/sbin:/usr/bin:/home/sdev/.local/bin",AIRFLOW_HOME="/work/airflow"
command=/home/sdev/.conda/envs/airflow/bin/airflow celery worker
process_name=%(program_name)s
directory=/work/airflow
numprocs=1
startsecs=9
stopsignal=TERM
stopwaitsecs=15
autostart=true
autorestart=true
redirect_stderr=true
user=sdev
group=sdev
stdout_logfile_maxbytes=50MB ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=10 ; # of stdout logfile backups (default 10)
stdout_logfile=/work/logs/supervisord/airflow-worker.log
stderr_logfile_maxbytes=50MB
stderr_logfile_backups=10
stderr_logfile=/work/logs/supervisord/airflow-worker.log
minfds=65535
minprocs=32700
2.3 新增 DAG
可以通过git 来管理 dag, 以及其依赖文件和说明文档
在 代码项目下 ./dags/ 下增加 dag文件
发版系统 或者 发版脚本 中配置发版命令如下
cd $发版目录;
~/.conda/envs/airflow/bin/pip install -r requirements.txt;
cp -rf dags/* /work/airflow/dags;
sudo supervisorctl reread;
sudo supervisorctl reload
使用发版系统 发版,dag即可增加
FAQ
Q1: 如何 分布式部署airflow 并且保证 高可用?
基础的组件是 airflow(mysql后端) + celery + redis
airflow高可用原理,通过在不同服务器上使用相同的配置,通过同一个数据后端和redis队列,来进行数据上的交互,
同时 airflow 的各个程序相互独立没有依赖,所以webserver, scheduler, worker 可以分别在不同服务器启动。
同时可以在多个服务器上启动相同的程序,比如在不同服务器上启动worker,来做到高可用。
启动多个 airflow webserver 节点 可以负载均衡大量的web请求
启动多个 airflow celery worker 节点 可以分流dag任务
值得一提的是 airflow 2.1.2 版本已经可以启用多个 airflow scheduler 节点 来分流调度压力并且保证高可用,
不过,数据库必须为 mysql8,因为运用到了 mysql8 的行锁 SKIP LOCKED or NOWAIT 特性来保证一个任务不会多次被调度,同时 result_backend 配置 应为官方 db+mysql 引擎 可以良好支持。
celery + redis 的方案,由于celery broker 暂不支持 redis集群,所以为了保证redis的高可用,使用了redis哨兵机制(阿里云有现成的解决方案,物美价廉)
Q2: 为什么用supervisord 启动不了 worker(或者其他) 节点?
首先,排错,建议先看日志。然后针对问题解决。
其次,如果conda(或者其他环境)可以启动,因该考虑是环境配置问题,应该检查以下 supervisor 配置
environment 中 应该配置 PATH 和 AIRFLOW_HOME, 尤其是PATH 可以直接搬虚拟环境 PATH
command 需要全路径命令
user,group 要确定为 工作用户
Q3: 为什么处理大数据时,在不同task传递 处理数据 时会报错?
airflow 有一个xcom表格,会存储每个DAG task的入参,入参超过字段长度限制后会报错,如果修改数据表字符类型为longtext, task处理入参也会报错。我这里的解决方案就是,尽量在一个task中处理大数据,不让其作为参数传递,另外就是可以把数据存储在外部缓存中(作为文件存入 或着 存在mongo中),下个任务再取出,再者使用airflow支持的 spark-opreator 进行处理。
Q4: 为什么无法查看远程worker节点的日志?
打开配置文件
配置webserver 基础路径,如果不配置,日志以及其他接口会访问localhost
base_url = https://airflow-xxxx-xxxx.com/
配置secret_key,所有节点secret_key需要一样,否则跨节点访问接口会403
secret_key = abcdefg
配置日志文件所在位置
base_log_folder = /work/airflow/logs
打开远程日志
remote_logging = True
日志格式配置为json
json_format = True
另外需要配置 hosts文件,配置需要访问的节点主机名
eg:
work1 10.1.2.3
work2 10.1.2.4