在执行一项气流任务时,我遇到了环境变量问题。
[2019-08-19 04:51:04,603] {{bash_operator.py:127}} INFO - File "/home/ubuntu/.pyenv/versions/3.6.7/lib/python3.6/os.py", line 669, in __getitem__
[2019-08-19 04:51:04,603] {{bash_operator.py:127}} INFO - raise KeyError(key) from None
[2019-08-19 04:51:04,603] {{bash_operator.py:127}} INFO - KeyError: 'HOME'
[2019-08-19 04:51:04,639] {{bash_operator.py:131}} INFO - Command exited with return code 1
我的任务如下:
task_name = BashOperator(
task_id='task_name',
bash_command="cd path/to/manage.py && export LC_ALL=C.UTF-8 && export LANG=C.UTF-8 "
f'&& {Variable.get("python_virtualenv_path")}virtual-env-name/bin/python manage.py command_name',
retries=1,
pool='LightAndFast',
dag=dag
)
对这个问题有什么想法吗?
答案 0 :(得分:1)
这是事实,气流使用BashOperator
重置环境变量,至少我遇到了这个问题。有关操作员的文档,请访问:
https://airflow.apache.org/docs/stable/_modules/airflow/operators/bash_operator.html,
我找到了明确设置bash命令环境的方法,即
bash_task = BashOperator(
task_id="bash_task",
bash_command='echo "here is the message: \'$message\'"',
env={'message': '{{ dag_run.conf["message"] if dag_run else "" }}'},
)
因此,我将Bash命令的环境明确设置为:
env = os.environ.copy(),
确保早先在 dag 文件中import os
。它为我解决了这个问题。
答案 1 :(得分:0)
理想情况下,您将所有环境变量作为文件放置在-
/etc/default/
例如
/etc/default/airflow_vars
airflow_vars将包含您的环境变量,例如-
AIRFLOW_HOME =“安装了您的气流”
AIRFLOW_CONFIG =“您的AIRFLOW.CFG文件的位置”
PYTHONPATH =“您的常规PYTHON脚本/实用程序所在的路径”
以此类推。
如果您使用系统管理器(systemd / supervisord)-您将在 / etc / systemd / system (这是针对systemd的!)
[单位] Description =气流工作流程守护程序 之后= network-online.target cloud-config.service 需要= network-online.target
[服务] EnvironmentFile = / etc / default / airflow_vars
User =
Group =
Type = simple
WorkingDirectory =
ExecStart = <气流/箱/气流Web服务器/调度程序/工作人员的位置>
重新启动=始终
RestartSec = 5s
[安装]
WantedBy = multi-user.target
现在您的气流安装中将提供所有环境变量。
另一种方法是,只需在Admin
标签,Variables
选择下的UI中进行设置
这是Airflow文档上的链接,->
https://airflow.readthedocs.io/en/stable/concepts.html?highlight=environmental%20variables#variables