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 库版本以提高构建速度的主要内容,如果未能解决你的问题,请参考以下文章