气流 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 隧道
FileSystemException:无法检索文件长度(操作系统错误:没有这样的文件或目录,errno = 2)
Airflow SSH 操作员错误:遇到 RSA 密钥,应为 OPENSSH 密钥
FileSystemException:无法打开文件,路径 = '/storage/0/emulated/myfolder/myfile.txt'(操作系统错误:没有这样的文件或目录,errno =