【问题标题】:MWAA - Airflow - PythonVirtualenvOperator requires virtualenvMWAA - 气流 - PythonVirtualenvOperator 需要 virtualenv
【发布时间】:2022-06-24 17:22:10
【问题描述】:

我正在使用 AWS 的 MWAA service (2.2.2) 运行各种 DAG,其中大部分是使用标准 PythonOperator 类型实现的。我将 DAG 与任何共享需求一起捆绑到 S3 存储桶中,然后将 MWAA 指向相关对象和版本。到目前为止一切顺利。

我现在想使用 PythonVirtualenvOperator 类型实现 DAG,AWS 确认不支持开箱即用。我正在关注their guide,了解如何使用自定义插件修补行为,但继续收到来自 Airflow 的错误,显示在仪表板顶部以大红色字体显示:

DAG 导入错误 (1) …… AirflowException: PythonVirtualenvOperator 需要 virtualenv,请安装。

我已经确认该插件确实被 Airflow 拾取(我在管理屏幕中看到它引用了它),为避免疑问,我使用 AWS 在他们的 DAG 示例中提供的确切代码。 AWS 在这方面的文档非常简单,我还没有偶然发现任何社区讨论。

根据 AWS 的文档,我们希望插件在启动时运行,然后再处理任何 DAG。该插件本身似乎有效地重写了 venv 命令以使用 pip 安装的版本,而不是安装在机器上的版本,但是我一直在努力验证事情是否按照我期望的顺序发生。非常感谢任何有关调试实例行为的指针。

有人遇到过类似的问题吗? MWAA 文档中是否存在需要解决的空白?我是否遗漏了一些非常明显的东西?

可能相关,但我确实在调度程序的日志中看到此警告,这可能表明 MWAA 为何难以解决依赖关系?

警告:脚本 virtualenv 安装在 '/usr/local/airflow/.local/bin' 中,它不在 PATH 上。

【问题讨论】:

  • 以下答案正确,请打勾采纳

标签: python amazon-web-services airflow virtualenv mwaa


【解决方案1】:

Airflow 使用 shutil.which 来查找 virtualenv。通过 requirements.txt 安装的 virtualenv 不在 PATH 上。将 virtualenv 的路径添加到 PATH 可以解决此问题。 这里的文档是错误的https://docs.aws.amazon.com/mwaa/latest/userguide/samples-virtualenv.html

import os
from airflow.plugins_manager import AirflowPlugin
import airflow.utils.python_virtualenv 
from typing import List
def _generate_virtualenv_cmd(tmp_dir: str, python_bin: str, system_site_packages: bool) -> List[str]:
    cmd = ['python3','/usr/local/airflow/.local/lib/python3.7/site-packages/virtualenv', tmp_dir]
    if system_site_packages:
        cmd.append('--system-site-packages')
    if python_bin is not None:
        cmd.append(f'--python={python_bin}')
    return cmd
airflow.utils.python_virtualenv._generate_virtualenv_cmd=_generate_virtualenv_cmd
#This is the added path code
os.environ["PATH"] = f"/usr/local/airflow/.local/bin:{os.environ['PATH']}"
class VirtualPythonPlugin(AirflowPlugin):                
    name = 'virtual_python_plugin'

【讨论】:

  • 感谢@PeterRing,这非常有效。很好奇 AWS 指令中的代码是错误的。如果没有这种解决方法,我看不出任何人如何使用 MWAA 和 PythonVirtualOperator。
【解决方案2】:

首先...很抱歉在这里打破表格并要求在“答案”部分进行澄清,但由于是 StackOverflow 的新手并且还没有“50 声誉”,因此我无法在 cmets 中提出问题。

所以我的问题是: 代码 sn -p 需要去哪里?它只是在 DAG 文件的顶部,还是在 plugins.zip 文件中,还是在其他地方?

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    相关资源
    最近更新 更多