气流 SSH 操作错误:[Errno 2] 没有这样的文件或目录:

Posted

技术标签:

【中文标题】气流 SSH 操作错误:[Errno 2] 没有这样的文件或目录:【英文标题】:airflow SSH operator error: [Errno 2] No such file or directory: 【发布时间】:2021-07-14 05:53:13 【问题描述】:

气流 1.10.10 minikube 1.22.0 亚马逊emr

我在 kubernetes(minikube) 上运行气流。 Dags 从 github 同步。 Amazon EMR 上的 spark-submit 作为 CLI 模式。

为了做到这一点,我附上了 EMR pem 密钥。 因此,我从 AWS S3 获取 pem 密钥,而 ExtraInitContainer 正在获取图像 awscli 并将卷安装在 airlfow/sshpem

当我从气流 WebUI 建立连接时报告错误 “con_type”:“ssh” "key_file": "/opt/sshepm/emr.pem"

SSH operator error: [Errno 2] No such file or directory: '/opt/airflow/sshpem/emr.pem'

它就在那里。我认为这与一些 PATH 或权限问题有关,因为我在 ExtraInitContainer 上获得了 emr.pem 并且它的权限是 root。虽然我暂时将用户更改为 1000:1000,但气流 WebUI 在获取密钥时无法获取此目录存在一些问题。

完整日志如下

> Traceback (most recent call last):   File
    > "/home/airflow/.local/lib/python3.6/site-packages/airflow/contrib/operators/ssh_operator.py",
    > line 108, in execute
    >     with self.ssh_hook.get_conn() as ssh_client:   File "/home/airflow/.local/lib/python3.6/site-packages/airflow/contrib/hooks/ssh_hook.py",
    > line 194, in get_conn
    >     client.connect(**connect_kwargs)   File "/home/airflow/.local/lib/python3.6/site-packages/paramiko/client.py",
    > line 446, in connect
    >     passphrase,   File "/home/airflow/.local/lib/python3.6/site-packages/paramiko/client.py",
    > line 677, in _auth
    >     key_filename, pkey_class, passphrase   File "/home/airflow/.local/lib/python3.6/site-packages/paramiko/client.py",
    > line 586, in _key_from_filepath
    >     key = klass.from_private_key_file(key_path, password)   File "/home/airflow/.local/lib/python3.6/site-packages/paramiko/pkey.py",
    > line 235, in from_private_key_file
    >     key = cls(filename=filename, password=password)   File "/home/airflow/.local/lib/python3.6/site-packages/paramiko/rsakey.py",
    > line 55, in __init__
    >     self._from_private_key_file(filename, password)   File "/home/airflow/.local/lib/python3.6/site-packages/paramiko/rsakey.py",
    > line 175, in _from_private_key_file
    >     data = self._read_private_key_file("RSA", filename, password)   File
    > "/home/airflow/.local/lib/python3.6/site-packages/paramiko/pkey.py",
    > line 307, in _read_private_key_file
    >     with open(filename, "r") as f: FileNotFoundError: [Errno 2] No such file or directory: '/opt/airflow/sshpem/emr-pa.pem'
    > 
    > During handling of the above exception, another exception occurred:
    > 
    > Traceback (most recent call last):   File
    > "/home/airflow/.local/lib/python3.6/site-packages/airflow/models/taskinstance.py",
    > line 979, in _run_raw_task
    >     result = task_copy.execute(context=context)   File "/opt/airflow/class101-airflow/plugins/operators/emr_ssh_operator.py",
    > line 107, in execute
    >     super().execute(context)   File "/home/airflow/.local/lib/python3.6/site-packages/airflow/contrib/operators/ssh_operator.py",
    > line 177, in execute
    >     raise AirflowException("SSH operator error: 0".format(str(e))) airflow.exceptions.AirflowException: SSH operator error: [Errno 2] No
    > such file or directory: '/opt/airflow/sshpem/emr-pa.pem' [2021-07-14
    > 05:40:31,624] Marking task as UP_FOR_RETRY. dag_id=test_staging,
    > task_id=extract_categories_from_mongo, execution_date=20210712T190000,
    > start_date=20210714T054031, end_date=20210714T054031 [2021-07-14
    > 05:40:36,303] Task exited with return code 1

气流主页:/opt/airflow dags:/opt/airflow//dags pemkey : /opt/sshpem/ 气流.cfg:/opt/airflow 气流环境: 出口 PATH="/home/airflow/.local/bin:$PATH"

我的 yaml 文件

airflow: 
   image: 
     repository: airflow
   executor: KubernetesExecutor
   extraVolumeMounts:
    - name: sshpem
      mountPath: /opt/airflow/sshpem
   extraVolumes:
    - name: sshpem
      emptyDir: 
scheduler:
    extraInitContainers:
    - name: emr-key-file-download
      image: amazon/aws-cli
      command: [
        "sh",
        "-c",
        "aws s3 cp s3://mykeyfile/path.my.pem&& \
        chown -R 1000:1000 /opt/airflow/sshpem/"
      volumeMounts:
        - mountPath: /opt/airflow/sshpem
          name: sshpem

【问题讨论】:

【参考方案1】:

你使用的是 KubernetesExecutor 还是 CeleryExecutor?

如果是前者,那么您必须确保将额外的 init 容器添加到您正在使用的 pod_template(KubernetesExecutor 中的任务)作为单独的 POD 运行。

如果是后者,您应该确保也为工作人员添加了额外的 init 容器,而不仅仅是为调度程序添加)。

顺便说一句。 Airflow 1.10 已于 2021 年 6 月 17 日终止使用,它甚至不会收到关键的安全修复程序。您可以观看我们在最近的 Airflow 峰会“保持您的 Airflow 安全”-https://airflowsummit.org/sessions/2021/panel-airflow-security/ 上的演讲,了解升级到 Airflow 2 的重要性。

【讨论】:

我很高兴气流贡献者之一回答了我的问题。虽然你的答案很清楚,但请说出我的额外问题。 我用 yaml 文件编辑了一个问题,当您谈到将这个 ExtrainitContainer(awscli 图像) 添加到调度程序时我不清楚。非常感谢! 在您的示例中,这正是我所怀疑的。您正在使用 KubernetesExecutor,这意味着每个任务都在它自己的 Pod 中运行。在上面的示例中,您的 init 容器仅针对调度程序运行 - 您应该为 Kubernetes Executor 配置您的 pod 模板文件以也运行此 init 容器并将文件映射到运行 Airflow airflow.apache.org/docs/apache-airflow/stable/executor/… 的容器内 当气流 WebUI 失败时,当我在气流 pod 调度程序容器上运行气流测试命令时,它会成功。 我的气流版本是 1.10.11,我认为您的建议(从 1.10.12 开始支持 pod_template_file)不适用。所以我想我去把气流升级到 1.10.12 并写另一个 pod_template_file.yaml 并在某个地方找到那个文件?或将该模板包含在 main.yaml 文件中。我开始写了吗?我真的需要这个,因为到目前为止我已经挣扎了 10 个小时。不过,您已经非常感激了!

以上是关于气流 SSH 操作错误:[Errno 2] 没有这样的文件或目录:的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式在 dockerized apache 气流 python 操作符内创建 SSH 隧道

Bash 操作员错误:气流中没有这样的文件或目录

操作系统错误:没有这样的文件或目录,errno = 2

FileSystemException:无法检索文件长度(操作系统错误:没有这样的文件或目录,errno = 2)

Airflow SSH 操作员错误:遇到 RSA 密钥,应为 OPENSSH 密钥

FileSystemException:无法打开文件,路径 = '/storage/0/emulated/myfolder/myfile.txt'(操作系统错误:没有这样的文件或目录,errno =