Airflow版本升级 v1.10.12-> v2.4.1 生产实践
升级需求
当前v1.10.12版本有2个问题 (没排查到什么原因就打算升级试试)
1、新建Dag无法定时执行
2、老Dag的执行时间慢24小时
v1.10.12 → v1.10.15(v1到v2桥接版本) → v1.20.4
名称 | 版本 | 备注 |
---|---|---|
Airflow | v1.10.12 | conda环境下 |
Python | 3.8.8 | conda环境下 |
Supervisor | 3.8.8 | conda环境下, 管理Airflow |
一、备份
1、由于是阿里云主机 —— 直接服务器打快照即可
2、如果非云主机需要做如下 (保险起见下边这些也可以手动备份下)
配置文件
cp /beta/app/airflow/airflow.cfg{,_1.10.12.bak}
cp /beta/dmp/dwh/beta_dwh/docs/env_conf.py{,_1.10.12.bak}
cp /beta/dmp/dwh/beta_dwh/docs/base_conf.py{,_1.10.12.bak}
cp /etc/supervisor/config.d/airflow.ini{,_1.10.12.bak}
数据库?
使用的postgres, 不用备份, 回滚时将老库重名, 由Airflow创建新库
python包 (conda安装的)
cd /beta/app/anaconda/envs/airflow/lib/python3.8
cp -r site-packages site-packages-1.10.12
变量
平台中Admin -> Variables
命令格式,airflow variables set "exec_date" "2023-04-01"
Pools
平台中Admin -> Pools
命令格式,
airflow pools set "POOLS名称" "数量" "备注"
airflow pools set "ck_alone" 1 "Pool for standalone CK tasks"
二、升级至中间版本(v1.10.15)
v1.10.15是中间版本, 先升级至这个版本
1.pip安装1.10.15版本
# 由于是conda安装的airflow, 所以要先进入这个环境
conda activate airflow
# https://raw.githubusercontent.com/apache/airflow/constraints-1.10.15/constraints-3.8.txt
AIRFLOW_VERSION=1.10.15
PYTHON_VERSION="$(python --version | cut -d " " -f 2 | cut -d "." -f 1-2)"
CONSTRAINT_URL=https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt
pip install "apache-airflow==${AIRFLOW_VERSION}" --upgrade --constraint "${CONSTRAINT_URL}"
# 检查安装上了
pip list|grep airflow
2.升级数据库
airflow db upgrade
3.重新生成一个新key替换原配置(必须, 不然无法启动)
# 生成密钥
openssl rand -hex 30
cd $AIRFLOW_HOME
vi airflow.cfg
secret_key = temporary_key
替换为
secret_key = 37d148fcc8b7074ed8a3a7bxxxxxxx
4.重启服务
# supervisor也是conda环境下安装的
conda activate airflow
# worker和scheduler可以暂时不用重启
supervisorctl restart airflow-webserver
5.验证
UI界面 查看 About → Version 是V1.10.15版本
此时原先账号应该可以正常登录 → 如果不存在则需要新创建
三、升级至v1.20.4版本
1.升级前检查
1、安装 upgrade check 程序
pip install apache-airflow-upgrade-check
# 如果 airflow upgrade_check 报错
ModuleNotFoundError: No module named 'celery'
# 安装
pip install celery==5.4.0
pip install flower==1.2.0
2、创建文件
# upgrade-configuration.yaml
ignored_rules:
- LegacyUIDeprecated
- ConnTypeIsNotNullableRule
- PodTemplateFileRule
3、执行检查, 如果发生Fail需要先解决掉再继续
airflow upgrade_check --config=./upgrade-configuration.yaml
2.准备库版本文件
# https://raw.githubusercontent.com/apache/airflow/constraints-2.4.1/constraints-3.8.txt
AIRFLOW_VERSION=2.4.1
PYTHON_VERSION="$(python --version | cut -d " " -f 2 | cut -d "." -f 1-2)"
CONSTRAINT_URL=https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt
pip install "apache-airflow==${AIRFLOW_VERSION}" --upgrade --constraint "${CONSTRAINT_URL}"
# 如果有termcolor相关版本报错
pip install --ignore-installed termcolor
airflow db upgrade
# 查看新版本是否安装成功
pip list|grep airflow
3.修改配置文件 (v2.x特性)
cd $AIRFLOW_HOME
cp airflow.cfg{,_1.10.15.bak}
vim airflow.cfg
# 修改 或 新增下边的配置
[core]
# 关闭示例job
load_examples = False
4.重启Airflow生效
cp /etc/supervisor/config.d/airflow.ini{,_1.10.15.bak}
vi /etc/supervisor/config.d/airflow.ini
# 修改airflow worker的启动命令
[program:airflow-worker]
command=airflow worker
改为
command=airflow celery worker
重启
# 正常情况
supervisorctl update
supervisorctl stop airflow-webserver airflow-scheduler
supervisorctl start airflow-webserver airflow-scheduler
### supervisor可能需要整个重启或reload下, 直接修改启动airflow worker命令的方式 无法正常启动
# 非正常情况
airflow webserver -p 18080 -D
airflow scheduler -D
airflow worker -D
5.新建用户 (v2.x特性)
conda activate airflow
# 新建用户
airflow users create \
--username 用户名 \
--firstname Admin \
--lastname User \
--role Admin \
--email 用户@example.com \
--password 密码
# 设置变量(根据实际情况)
airflow variables set "exec_date" "2023-04-01"
# 设置Pools(根据实际情况)
airflow pools set "arc" 8 "Pool for arc related tasks"
airflow pools set "default_pool" 10 "Default pool"
6.验证
1、测试是否可以正常登录、版本号是变更
2、查看服务启动日志
cd $AIRFLOW_HOME
tail -n 300 -f logs/nohup.out
3、删除升级过程中出现的表(可选, 在登录新版Airflow后 顶部会展示表名, 会默认保存7或14天)
4、验证Dag是否正常跑通
四、回滚
1、快照恢复机器 (不是云主机就恢复配置)
2、将现有的airflow数据库修改名称, 与airflow区别
3、新库由程序新建后、将部分数据导入新库 —— 未做回滚操作 所以这部分有些未知
参考:
Apache Airflow 1.10.9 升级到 2.0.2 版本实践
官网中有说v1-v2 的桥接版本是1.10.15
Upgrading from 1.10 to 2
这里还有升级v2的文档 看看就行
Upgrading to Apache Airflow 2