直接用 pip install apache-airflow 安装后大概率无法运行,因缺依赖、sqlite 版本低、未初始化数据库及环境变量配置错误;airflow 2.4+ 的 standalone 模式最省事,自动启动 web server、scheduler、sqlite db 并创建默认管理员用户,仅需 python 3.8+、pip ≥ 21.3 及 sqlite3 ≥ 3.15.0。

直接用 pip install apache-airflow 能装上,但大概率跑不起来——缺依赖、SQLite 版本太低、数据库没初始化、环境变量没设对,全是坑。
为什么 standalone 模式最省事(尤其新手)
Airflow 2.4+ 自带 airflow standalone 命令,它会自动拉起 Web Server + Scheduler + SQLite DB + 默认管理员用户,全程不用手动配库、建表、设密码。
- 前提:Python 3.8+、pip ≥ 21.3、系统有
sqlite3(版本 ≥ 3.15.0,Ubuntu 20.04+/CentOS 8+ 一般自带) - 执行:
pip install apache-airflow→airflow standalone - 它会在当前目录生成
airflow.cfg和airflow.db,首次运行会自动创建 admin 用户(用户名/密码都是admin) - 访问
http://localhost:8080就能进 UI,不用再单独启webserver或scheduler
用 MySQL 时必须提前装好 client 驱动
如果想把 sql_alchemy_conn 改成 MySQL(比如 mysql+pymysql://airflow:airflow@localhost:3306/airflow),光装 apache-airflow[mysql] 不够,还得确保底层 Python 能连 MySQL。
- 先装系统级依赖:
yum install mysql-devel(CentOS/RHEL)或apt-get install libmysqlclient-dev(Ubuntu/Debian) - 再装 Python 驱动:
pip install pymysql(推荐)或mysqlclient(C 扩展,性能略好但编译易失败) - 验证:
python -c "import pymysql; print(pymysql.VERSION)"不报错才算通 - 注意:MySQL 用户必须有
CREATE权限,否则airflow db init会卡在建表
virtualenv 是底线,别用 root pip install
全局 pip install 容易污染系统 Python,后续升级/降级 Airflow 会冲突,而且 AIRFLOW_HOME 权限容易出问题。
- 正确姿势:
python -m venv ~/airflow-venv→source ~/airflow-venv/bin/activate - 设环境变量必须在激活后:
export AIRFLOW_HOME=~/airflow(路径不能有空格、中文、软链) -
airflow db init必须在AIRFLOW_HOME目录下执行,否则会初始化到默认路径(比如/root/airflow) - 如果之前装过 Airflow,先
pip uninstall apache-airflow,再删掉AIRFLOW_HOME下的airflow.db和logs/目录,不然配置改了也无效
常见启动失败原因和对应检查点
跑 airflow webserver 或 airflow standalone 报错,90% 出在这几处:
-
ModuleNotFoundError: No module named 'pymysql'→ 没装驱动,或装在系统 Python 里,而 virtualenv 里没装 -
airflow.exceptions.AirflowConfigException: error: sqlite C library version too old→ 系统 sqlite3 太老,得源码编译升级(CentOS 7 默认是 3.7.17,必须升到 3.15+) - Web 页面打不开,但进程在跑 → 检查
airflow.cfg里web_server_host是否设为0.0.0.0(默认是localhost,外网访问不了) -
airflow db init卡住不动 → MySQL 连接串写错(比如端口不对、用户密码错)、或数据库没创建、或防火墙拦了 3306
真正麻烦的不是装,是装完发现 airflow.cfg 里一堆参数要调、SQLAlchemy 连接要验、时区要改、DAG 文件夹权限要设——这些全得动手试,没法靠一键脚本兜底。











