您可以使用以下格式的环境变量来设置/覆盖在
${AIRFLOW_HOME}/airflow.cfg
中指定的airflow选项:$AIRFLOW__{SECTION}__{KEY}(请注意双下划线)。这里是一个
链接到airflow文档。因此,您可以简单地执行以下操作
export AIRFLOW__CORE__DAGS_FOLDER=/path/to/dags/folder
然而,对于不同的项目这样做既繁琐又容易出错。作为替代方案,您可以考虑使用
pipenv来管理虚拟环境,而不是使用Anaconda。这里有一篇
nice guide关于
pipenv
和它解决的问题。其中一个
pipenv
的
default features是在启用虚拟环境的情况下生成shell时自动加载
.env
文件中定义的变量。因此,以下是使用
pipenv
的工作流程示例:
cd /path/to/my_project
pipenv install --python=3.7 Flask==1.0.3 apache-airflow==1.10.3
echo "AIRFLOW_HOME=${PWD}/airflow" >> .env
pipenv shell
airflow initdb
mkdir -p ${AIRFLOW_HOME}/dags/
注意:我会在最后解释为什么使用
Flask==1.03
,这是因为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
现在,当您第一次初始化Airflow时,它将创建
${AIRFLOW_HOME}/airflow.cfg
文件,并使用/扩展
${AIRFLOW_HOME}/dags
作为
dags_folder
的值。如果您仍需要不同的
dags_folder
位置,则可以再次使用
.env
文件。
echo "AIRFLOW__CORE__DAGS_FOLDER=/different/path/to/dags/folder" >> .env
因此,您的
.env
文件将如下所示:
AIRFLOW_HOME=/path/to/my_project/airflow
AIRFLOW__CORE__DAGS_FOLDER=/different/path/to/dags/folder
我们取得了什么成就以及为什么这将完美地发挥作用
- 由于您在虚拟环境中安装了
airflow
,因此需要激活它才能使用 airflow
- 由于您使用了
pipenv
进行安装,因此需要使用 pipenv shell
来激活虚拟环境
- 由于您使用了
pipenv shell
,因此您总是会获得定义在 .env
中的变量导出到您的虚拟环境中。除此之外,pipenv
仍然是一个子shell,因此当您退出时,所有额外的环境变量也会被清除。
- 使用 airflow 的不同项目会有不同的日志文件等位置。
pipenv 的附加说明
- 要将使用 pipenv 创建的虚拟环境用作 IDE 的项目解释器,请使用
pipenv --py
提供的路径。
- 默认情况下,
pipenv
会像 conda 一样在相同的全局位置创建所有虚拟环境,但您可以通过将 export PIPENV_VENV_IN_PROJECT=1
添加到您的 .bashrc
(或其他 rc
)来更改该行为,以在项目的根目录中创建 .venv
。然后,PyCharm 将能够在进入项目解释器设置时自动选择它。
关于使用 Flask==1.0.3
的注意事项
PyPi上的Airflow 1.10.3依赖于
flask>=1.0, <2.0
和
jinja2>=2.7.3, <=2.10.0
。今天,当我测试代码片段时,可用的最新版本
flask
是
1.1.0,它依赖于
jinja2>=2.10.1
。这意味着虽然pipenv可以安装所有必需的软件,但它无法锁定依赖关系。因此,为了干净地使用我的代码示例,我必须指定需要与airflow要求兼容的
jinja2
版本的
flask
版本。但是不用担心,GitHub上的最新版本
airflow
已经解决了这个问题。
pipenv
构建在pip
和virtualenv
之上,并在其底层使用它们。在您的情况下,优势主要来源于内置的能力,可以使用*.env
文件来为特定项目定义AIRFLOW_HOME
,因为在.bashrc
(或类似文件)中进行定义仍然是全局的。 - Ilya Kisilairflow
几个小时前在 pypi 上发布了 1.10.4 版本。我刚刚尝试了pipenv install apache-airflow
,一切都正常。通常情况下,我希望pipenv
在传递选项方面与pip
类似,但最好查阅他们的文档。 - Ilya Kisiltest_dag.py
的DAG文件,并将其放在dags
目录中。我现在在我的pipenv shell中,使用airflow webserver -p 8080
实例化Web服务器。它可以正常工作。但是我没有看到我的test_dag
。相反,我看到了许多其他的DAG,例如