Airflow中BeamRunPythonPipelineOperator安装py_requirements失败如何解决
问题根因
官方Apache Airflow镜像为了适配非root用户运行场景,默认在全局pip配置文件中开启了user = true参数,所有pip安装操作会默认携带--user标记。
BeamRunPythonPipelineOperator运行时会自动创建独立的Python虚拟环境,这类虚拟环境默认禁用user级site-packages目录(对应virtualenv工具的默认行为),和全局pip的默认--user安装规则冲突,就会抛出对应错误。
本地Mac环境运行正常是因为本地的pip没有配置默认开启user安装,不存在规则冲突。
解决方案
按实施成本和适用范围从高到低排序:
方案1:直接修改DAG配置(最快,无需改集群配置)
在你的BeamRunPythonPipelineOperator参数中新增env配置,覆盖当前任务的PIP_USER环境变量即可:
tfdv_operator = BeamRunPythonPipelineOperator( # 原有所有配置保持不变 env={"PIP_USER": "0"}, # 新增这一行即可 task_id="run_tfdv_on_dataflow", py_file="gs://my-datasets/tfdv/beam_pipeline_tfdv.py", # 剩下的原有参数不变 )
修改后直接重跑DAG即可生效。
方案2:修改Airflow Worker镜像(一劳永逸,解决所有同类任务问题)
在你现有的Airflow Worker Dockerfile中新增删除pip默认user配置的命令:
FROM apache/airflow:2.1.1-python3.8 USER root # 新增以下命令删除pip默认user安装配置 RUN sed -i '/user = true/d' /etc/pip.conf \ && apt-get update \ && apt-get install -y --no-install-recommends \ build-essential gcc git \ && apt-get autoremove -yqq --purge \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* USER airflow
重新构建Worker镜像并更新Kubernetes集群中的Airflow Worker workload后,所有需要创建虚拟环境的任务都不会再触发该错误。
方案3:修改虚拟环境参数(不推荐,仅做兜底)
将你DAG中BeamRunPythonPipelineOperator的py_system_site_packages参数从False改为True,让虚拟环境允许访问系统级和user级site-packages,也可以解决该错误。但该方案会引入系统原有依赖和任务指定依赖版本冲突的风险,非必要不建议使用。
内容的提问来源于stack exchange,提问作者user3595632
相关产品推荐
相关产品推荐

