Airflow 设置 python 库版本以提高构建速度

Posted

技术标签:

【中文标题】Airflow 设置 python 库版本以提高构建速度【英文标题】:Airflow set python library versions to improve build speed 【发布时间】:2021-11-30 16:24:10 【问题描述】:

过去,我们的 Airflow 部署的 docker 映像构建需要大约 5 分钟,而突然之间,它需要一个多小时。话虽如此,我们在几个月内不必重建我们的形象,所以不确定问题是什么时候出现的......

看起来https://***.com/questions/65122957/resolving-new-pip-backtracking-runtime-issue 是罪魁祸首。我们在构建过程中看到很多类似这样的警告:

=> => #   Downloading google_cloud_os_login-2.3.1-py2.py3-none-any.whl (42 kB)                                                          
=> => # INFO: This is taking longer than usual. You might need to provide the dependency resolver with stricter constraints             
=> => # to reduce runtime. See https://pip.pypa.io/warnings/backtracking for guidance. If you want to abort this run, press             
=> => # Ctrl + C.   
=> => #   Downloading google_cloud_os_login-2.2.1-py2.py3-none-any.whl (41 kB)                                                          
=> => #   Downloading google_cloud_os_login-2.2.0-py2.py3-none-any.whl (44 kB) 

这是我们的 Dockerfile 中花费一小时的行+

RUN set -ex \
    && buildDeps=' \
        freetds-dev \
        libkrb5-dev \
        libsasl2-dev \
        libssl-dev \
        libffi-dev \
        libpq-dev \
        git \
    ' \
    && apt-get update -yqq \
    && apt-get install -yqq --no-install-recommends \
        $buildDeps \
        freetds-bin \
        build-essential \
        apt-utils \
        curl \
        rsync \
        netcat \
        locales \
    && sed -i 's/^# en_US.UTF-8 UTF-8$/en_US.UTF-8 UTF-8/g' /etc/locale.gen \
    && locale-gen \
    && update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 \
    && useradd -ms /bin/bash -d $AIRFLOW_USER_HOME airflow \
    && pip install -U pip setuptools wheel \
    && pip install pytz \
    && pip install pyOpenSSL \
    && pip install ndg-httpsclient \
    && pip install pyasn1 \
    && pip install apache-airflow[crypto,postgres,slack,kubernetes,gcp,docker,ssh]==$AIRFLOW_VERSION \
    && if [ -n "$PYTHON_DEPS" ]; then pip install $PYTHON_DEPS; fi \
    && apt-get purge --auto-remove -yqq $buildDeps \
    && apt-get autoremove -yqq --purge \
    && apt-get clean \
    && rm -rf \
        /tmp/* \
        /var/tmp/* \
        /usr/share/man \
        /usr/share/doc \
        /usr/share/doc-base \
        /var/lib/apt/lists/*

... 
...

COPY requirements.txt /requirements.txt
RUN pip install -r /requirements.txt

这是我们的requirements.txt

google-cloud-core==1.4.1
google-cloud-datastore==1.15.0
gcsfs==0.6.1
flatten-dict==0.4.2
bigquery_schema_generator==1.4
backoff==1.11.1
six==1.13.0
ndjson==0.3.1
pymongo==3.1.2
SQLAlchemy==1.3.15
pandas==1.3.1
numpy==1.21.1
billiard

我实际上对这个引用google_cloud_os_login 的特定警告消息感到非常困惑,因为挂起的构建步骤是我分享的以RUN set -ex 开头的行,它看起来没有任何谷歌云安装?我们通过 requirements.txt (-core, -datastore) 安装了一些谷歌云的东西,但是在我们的 dockerfile 中,requirements.txt 上的 COPY 和 RUN pip install 行要低得多(如...所示)。许多图书馆都会弹出这些警告,但看起来google_cloud_os_login 确实是一个需要大量时间的罪魁祸首。

RUN set -ex ... 命令在哪里提示安装google_cloud_os_login?我们如何在这个库上设置一个特定的版本号,以加快这个 docker 镜像的构建?

【问题讨论】:

"RUN set -ex ... 命令在哪里" 好吧,你为什么不把那条荒谬的长线分开找出来? $PYTHON_DEPS 中有什么内容? @aaron ARG PYTHON_DEPS="",所以它是一个空变量,是的,我喜欢拆分 RUN 命令的想法。 【参考方案1】:

我认为您看到的各种 google 包是 apache-airflow[gcp] 的依赖项。

为了加快安装速度,documentation 建议您使用他们提供的约束文件之一。他们创建名为constraints-<version> 的标签,其中包含您可以使用--constraint 传递给pip 的文件。

例如,当尝试安装 2.2.0 时,有一个 constraints-2.2.0 标签。在this tag's file tree 中,您会看到类似constraints-3.8.txt 的文件,其中3.8 是我正在使用的python 版本。

pip install apache-airflow[gcp]==2.2.0 --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.2.0/constraints-3.8.txt"

【讨论】:

以上是关于Airflow 设置 python 库版本以提高构建速度的主要内容,如果未能解决你的问题,请参考以下文章

使用 Airflow 运算符将运行时版本传递给 CMLE

大数据调度平台Airflow:Airflow使用

大数据调度平台Airflow:Airflow单机搭建

Airflow 中文文档:设置配置选项

如何设置 Airflow DAG 权限以查询基于 Google Sheets 文档构建的 BigQuery 表?

Airflow自定义插件, 使用datax抽数