Airflow 简介#
Apache Airflow™ 是一个开源平台,用于开发、调度和监控面向批处理的工作流程。 Airflow 的可扩展 Python 框架使您能够构建与几乎任何技术连接的工作流程。 Web 界面有助于管理工作流程的状态。 Airflow 可以通过多种方式进行部署,从笔记本电脑上的单个进程到支持最大工作流程的分布式设置。
实现目标#
结合我们自己的邮件 ETL 工程,把流程调度方面的工作抽离出来交给 airflow,部署方式是通过业务工程本身的虚拟环境安装 airflow,将其作为业务工程的一部分是比较简单的方案,正常应该是将两者解耦,考虑到这期目的简单,流程数少,也仅仅为当前的业务工程服务,如果未来有其他的工程需要用到 airflow 再考虑解耦问题。
安装步骤#
export AIRFLOW_HOME=/工程目录/airflow
指定一个系统变量 AIRFLOW_HOME 为当前工程目录下的 airflow 文件夹,作用是把 airflow 的配置文件、log 文件夹、dag 文件夹、plugin 文件夹、sqlite 数据库文件放到当前工程目录,否则 airflow 会自动在 /home 目录建立次文件夹
AIRFLOW_VERSION=2.7.3
# Extract the version of Python you have installed. If you're currently using a Python version that is not supported by Airflow, you may want to set this manually.
# See above for supported versions.
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"
# For example this would install 2.7.3 with python 3.8: https://raw.githubusercontent.com/apache/airflow/constraints-2.7.3/constraints-3.8.txt
pip install "apache-airflow==${AIRFLOW_VERSION}" --constraint "${CONSTRAINT_URL}"
激活虚拟环境后(source ./env/bin/activate) 执行以上脚本安装 2.7.3 版本的 airflow。要求虚拟环境绑定的是主机的 python 版本为 3.8+,这一步在第一回安装会有各种依赖问题,尤其是和当前业务工程的依赖之间的问题,依次解决即可。如果 install 很慢的话替换国内的源即可 -i https://pypi.mirrors.ustc.edu.cn/simple/
airflow standalone
启动单机版本服务,这一步如果启动成功就基本上就成功一大半了,但基本是不可能的。遇到的第一个问题就是提示 sqlLite 版本过低,主要是因为 centos 的缘故,自带的 sqlite3 版本是 3.7,但是 airflow 需要的最低版本是 3.15,Ubuntu 应该是没有这个问题的。解决方案也不复杂,安装 sqlite 的 3.15 版本的副本,为什么不直接升级原来的,因为怕把系统搞崩。然后替换一下快捷指令重新执行就可以了。这里有一个比较坑的点,就是正常生产环境官网是不推荐使用 sqlite 的,但想要更改连接方式只能去修改配置文件./airflow/airflow.cfg,神奇的是这个目录,甚至是这个文件夹,只有在启动了一次 airflow 服务才会被创建!之前我一直不想升级 sqlite,想直接改数据库连接方式再启动,我还以为系统变量没生效,但是用户目录也没有,才在官方文档翻到这个警告。所以说 sqlLite 是不可缺少的。即使你以后不想使用他最为数据库后端。
sqlite3 --version
mkdir sqlite3_upgrade
cd sqlite3_upgrade
wget --no-check-certificate https://www.sqlite.org/2023/sqlite-autoconf-3440200.tar.gz
tar -xzvf sqlite-autoconf-3440200.tar.gz
cd sqlite-autoconf-3440200/
./configure
make
make install
/usr/local/bin/sqlite3 --version
cp /usr/bin/sqlite3 /usr/bin/sqlite3_old
rm /usr/bin/sqlite3
ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3
sqlite3 --version
以上是 centos7 升级 sqlite 的参考步骤
当输出 3.44 的时候就可以启动了
airflow standalone
正常来说就可以启动了,然后就去项目目录下的 airflow 文件夹看到了对应的 log 文件夹,airflow.cfg,以及 airflow.db。
去浏览器输入机器的 IP 地址 + 端口号 8080 就可以访问到 web 页面了 默认用户名:admin ,默认密码在后台日志以及 airflow 文件夹的 standalone_admin_password.txt 文件中都有。
接下来就是替换 sqlite 为 mysql(如果是 postgreSQL 会更简单,airflow 自带与之交互的插件),更改配置文件的参数为:
sql_alchemy_conn = mysql+pymysql://username:password@host:port/db_name
注意官方文档推荐的:
mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
在 centos 下会有问题。mysqlclient 驱动会装不上或者版本不匹配。反正最后我装上了,但是还没生效就换了 python 的 mysql 驱动,即使是 mysqlclient 经过了 airflow 的官方 CI 的验证。估计 Ubuntu 或者其他系统应该没啥问题,
ps: 用官方的也行了 下载一个符合系统版本的(centos7)mariadb-devel 安装即可,
改完保存后执行:
airflow db migrate
系统会自己迁移他所需的数据库到你指定的 mysql 服务器,不出意外又来问题了,airflow 建表的时候提示:
airflow Invalid default value for 'updated_at'
大概可以了解到是因为 mysql 默认时间格式的问题,mysql 当前为严格模式,需要更改 mysql 的模式设置为:
SET SQL_MODE='ALLOW_INVALID_DATES';
但这只是临时方案,最终还需要去改 mysql 的配置文件( my.ini (mysql configuration file)),移除 NO_ZERO_DATE from sql-mode option 然后重启。但因为我们 mysql 是 docker 部署的,docker 内部还不能使用 vim 命令。。。这个问题还在待定
最后:
airflow db migrate
airflow standalone
可以看到 mysql 库中新增了一大堆表,系统也正常能通过 web 访问就大功告成了!
未解决问题#
- mysql 配置文件永久修改
- sqlLite 不永久更改以后有咩有问题
- 生产环境部署的模式肯定要和现在的不一致