Docker中运行Airflow2.0+集成OpenLineage与Marquez的配置方案
问题汇总
部署环境:基于CeleryExecutor的Airflow 2.0+ Docker集群,使用官方提供的docker-compose模板部署,目标是运行Marquez官方仓库examples/airflow路径下的示例DAG,通过OpenLineage对接Marquez实现数据血缘能力
已做操作:
- 在项目
.env中配置了OpenLineage相关环境变量 - 拉取Marquez官方仓库代码,按README指引启动Marquez服务,预期OpenLineage、Marquez API监听5000端口
异常现象: - 访问
localhost:3000的Marquez UI,无任何作业血缘记录 - 执行
airflow-init初始化流程时报错:No module named 'openlineage',无法加载lineage段配置的backend项openlineage.lineage_backend.OpenLineageBackend,初始化容器以状态码1退出 - 控制台提示存在
airflow-docker_marquez_1、airflow-docker_marquez_web_1两个孤立容器
根因
- Airflow官方默认Docker镜像未预装
openlineage-airflow依赖包,直接配置lineage backend会因模块缺失导致初始化失败 - Airflow集群和Marquez服务通过两个独立的docker-compose命令启动,属于不同的项目栈,网络默认隔离,Airflow容器无法访问到Marquez的5000 API端口,就算依赖装完也发不出血缘事件
- 两个孤立容器是因为Marquez栈单独启动时未纳入当前Airflow的compose项目管理,资源生命周期和网络配置不互通
- 仅在
.env文件配置变量无法保证所有Airflow核心服务(scheduler、worker、webserver、triggerer)都拿到OpenLineage相关配置,且容器内错误使用localhost作为服务地址会导致访问不通
修复步骤
1. 补装OpenLineage依赖
两种方案选一个即可:
- 快速验证方案:在
docker-compose.yaml的x-airflow-common公共配置块中,给所有Airflow服务的启动前置步骤加安装命令,比如在入口点执行前运行pip install openlineage-airflow,注意版本和你部署的Airflow大版本对齐即可 - 生产推荐方案:自定义Airflow镜像,新建Dockerfile内容如下:
# 把基础镜像版本替换成你实际使用的Airflow版本 FROM apache/airflow:2.8.1 RUN pip install --no-cache-dir openlineage-airflow
把compose中原来的Airflow镜像配置改成build指向该Dockerfile的路径,后续重新构建镜像即可。
2. 清理孤立容器,统一服务栈配置
先停掉所有运行中的容器:
- 在Airflow的compose目录执行
docker compose down,需要保留已有Airflow元数据就不要加-v参数 - 进入Marquez代码的docker compose目录,执行
docker compose down,清理掉之前单独启动的Marquez相关容器,解决孤立容器提示问题
不要单独启动Marquez服务,把Marquez、Marquez Web、Marquez依赖的PostgreSQL服务定义直接复制到Airflow的docker-compose.yaml中,保证所有服务在同一个docker网络下,确认端口映射配置:
- Marquez API:
5000:5000 - Marquez Web UI:
3000:3000
3. 修正OpenLineage配置
在x-airflow-common的environment配置块下,追加以下环境变量,保证所有Airflow服务都能加载到配置:
AIRFLOW__LINEAGE__BACKEND: openlineage.lineage_backend.OpenLineageBackend # 注意这里必须用Marquez在compose内的服务名做访问地址,不能写localhost,容器内localhost指向容器自身 OPENLINEAGE_URL: http://marquez:5000 OPENLINEAGE_NAMESPACE: airflow # 可自定义命名空间
4. 重启验证
- 执行
docker compose build重新构建带OpenLineage依赖的Airflow镜像 - 执行
docker compose up airflow-init重新跑初始化流程,确认不再报模块缺失的错误 - 执行
docker compose up -d启动所有服务 - 等所有服务健康检查通过后,触发示例DAG运行,DAG执行完成后刷新Marquez UI即可看到对应的作业和血缘记录
排查提示
如果还是看不到血缘数据,可按以下顺序排查:
- 进入任意Airflow核心容器(scheduler/worker),执行
curl http://marquez:5000/api/v1/namespaces,确认能正常返回Marquez API响应,不通就检查服务名和网络配置 - 查看scheduler、worker的服务日志,有没有OpenLineage事件发送失败的报错,根据报错调整配置
- 确认运行的示例DAG是对应Airflow 2.0+的适配版本,旧版DAG示例可能存在上报逻辑不兼容的问题
内容的提问来源于stack exchange,提问作者Dier Hou
相关产品推荐
相关产品推荐

