如何在虚拟环境中使用 apache 气流?

Com*_*and 7 python apache virtualenv directed-acyclic-graphs airflow

我对使用 apache 气流很陌生。我使用 pycharm 作为我的 IDE。我创建了一个项目(anaconda 环境),创建了一个包含 DAG 定义和 Bash 运算符的 python 脚本。当我打开我的气流网络服务器时,我的 DAGS 没有显示。仅显示默认示例 DAG。我的AIRFLOW_HOME变量包含~/airflow. 所以我在那里存储了我的 python 脚本,现在它显示了。

我如何在项目环境中使用它?

我是否在每个项目开始时更改环境变量?

有没有办法为每个项目添加特定的气流主目录?

我不想将我的 DAG 存储在默认的气流目录中,因为我想将它添加到我的 git 存储库中。请帮帮我。

Ily*_*sil 16

您可以${AIRFLOW_HOME}/airflow.cfg使用以下格式设置/覆盖在环境变量中指定的气流选项:$AIRFLOW__{SECTION}__{KEY}(注意双下划线)。这是气流文档的链接。所以你可以简单地做

export AIRFLOW__CORE__DAGS_FOLDER=/path/to/dags/folder
Run Code Online (Sandbox Code Playgroud)

但是,为不同的项目执行此操作既乏味又容易出错。作为替代方案,您可以考虑使用pipenv而不是 Anaconda 来管理虚拟环境。这是一个关于它解决的问题的很好的指南pipenv。的默认功能之一pipenv是,.env当您在激活 virtualenv 的情况下生成 shell 时,它会自动加载文件中定义的变量。因此,您的工作流程pipenv可能如下所示:

cd /path/to/my_project

# Creates venv with python 3.7 
pipenv install --python=3.7 Flask==1.0.3 apache-airflow==1.10.3

# Set home for airflow in a root of your project (specified in .env file)
echo "AIRFLOW_HOME=${PWD}/airflow" >> .env

# Enters created venv and loads content of .env file 
pipenv shell

# Initialize airflow
airflow initdb
mkdir -p ${AIRFLOW_HOME}/dags/
Run Code Online (Sandbox Code Playgroud)

注意:Flask==1.03I 的用法会在最后解释,但这是因为 pipenv 会检查子依赖项是否兼容以确保可重现性。

因此,在这些步骤之后,您将获得以下项目结构

my_project
??? airflow
?   ??? airflow.cfg
?   ??? airflow.db
?   ??? dags
?   ??? logs
?   ?   ??? scheduler
?   ?       ??? 2019-07-07
?   ?       ??? latest -> /path/to/my_project/airflow/logs/scheduler/2019-07-07
?   ??? unittests.cfg
??? .env
??? Pipfile
??? Pipfile.lock
Run Code Online (Sandbox Code Playgroud)

现在,当您第一次初始化气流时,它将创建${AIRFLOW_HOME}/airflow.cfg文件并将使用/扩展${AIRFLOW_HOME}/dagsdags_folder. 如果您仍然需要不同的位置dags_folder,您可以.env再次使用文件

my_project
??? airflow
?   ??? airflow.cfg
?   ??? airflow.db
?   ??? dags
?   ??? logs
?   ?   ??? scheduler
?   ?       ??? 2019-07-07
?   ?       ??? latest -> /path/to/my_project/airflow/logs/scheduler/2019-07-07
?   ??? unittests.cfg
??? .env
??? Pipfile
??? Pipfile.lock
Run Code Online (Sandbox Code Playgroud)

因此,您的.env文件将如下所示:

AIRFLOW_HOME=/path/to/my_project/airflow
AIRFLOW__CORE__DAGS_FOLDER=/different/path/to/dags/folder
Run Code Online (Sandbox Code Playgroud)

我们取得了什么成就以及为什么这会很好地工作

  1. 由于您安装airflow在虚拟环境中,因此您需要激活它才能使用airflow
  2. 因为你是用 做的,所以pipenv你需要使用pipenv shell来激活 venv
  3. 由于您使用pipenv shell,您总是会在.env导出到您的 venv 中获得定义的变量。最重要的是pipenv仍然是一个子shell,因此,当您退出它时,所有其他环境变量也将被清除。
  4. 使用气流的不同项目的日志文件等会有不同的位置。

关于 pipenv 的附加说明

  1. 为了使用 pipenv 创建的 venv 作为 IDE 的项目解释器,请使用pipenv --py.
  2. 默认情况下,pipenv像 conda 一样在相同的全局位置创建所有 venv,但是您可以.venv通过添加export PIPENV_VENV_IN_PROJECT=1到您的.bashrc(或其他rc)中来更改该行为以在项目的根目录中创建。然后,当您进入项目解释器的设置时,PyCharm 将能够自动拾取它。

使用注意事项 Flask==1.0.3

来自 PyPi 的 Airflow 1.10.3 取决于flask>=1.0, <2.0jinja2>=2.7.3, <=2.10.0。今天,当我测试代码片段时,最新的可用版本flask1.1.0,它依赖于jinja2>=2.10.1. 这意味着虽然 pipenv 可以安装所有需要的软件,但它无法锁定依赖项。因此,为了干净地使用我的代码示例,我必须指定flask需要jinja2与气流要求兼容的版本。但是没有什么可担心的。airflowGitHub 上的最新版本已经修复了这个问题。