【问题标题】:Airflow SSHOperator's Socket exception: Bad file descriptorAirflow SSHOperator 的 Socket 异常:文件描述符错误
【发布时间】:2021-08-10 15:57:25
【问题描述】:

在 Airflow 中,我使用 SSHOperator 来调用用于某些自动化工作的 API。工作成功运行并生成了报告,但由于 Socket 异常,Airflow 返回任务失败。

这个错误有时会发生,我想知道导致它的原因。

收到的错误信息:

[2021-07-20 08:00:07,345] {ssh.py:109} INFO - Running command: curl -u <user:pw> <URL>
[2021-07-20 08:00:07,414] {ssh.py:145} WARNING -   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
[2021-07-20 08:00:08,420] {ssh.py:145} WARNING - 
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
[2021-07-20 08:00:09,421] {ssh.py:145} WARNING - 
  0     0    0     0    0     0      0      0 --:--:--  0:00:02 --:--:--     0
[2021-07-20 08:00:10,423] {ssh.py:145} WARNING - 
  0     0    0     0    0     0      0      0 --:--:--  0:00:03 --:--:--     0
[2021-07-20 08:00:10,615] {ssh.py:141} INFO - Report Sent Successfully.
[2021-07-20 08:00:10,616] {transport.py:1819} ERROR - Socket exception: Bad file descriptor (9)
[2021-07-20 08:00:10,633] {taskinstance.py:1481} ERROR - Task failed with exception
Traceback (most recent call last):
  File "/u01/airflow-venv/lib/python3.8/site-packages/airflow/providers/ssh/operators/ssh.py", line 152, in execute
    stdout.channel.close()
  File "/u01/airflow-venv/lib/python3.8/site-packages/paramiko/channel.py", line 671, in close
    self.transport._send_user_message(m)
  File "/u01/airflow-venv/lib/python3.8/site-packages/paramiko/transport.py", line 1863, in _send_user_message
    self._send_message(data)
  File "/u01/airflow-venv/lib/python3.8/site-packages/paramiko/transport.py", line 1839, in _send_message
    self.packetizer.send_message(data)
  File "/u01/airflow-venv/lib/python3.8/site-packages/paramiko/packet.py", line 431, in send_message
    self.write_all(out)
  File "/u01/airflow-venv/lib/python3.8/site-packages/paramiko/packet.py", line 367, in write_all
    raise EOFError()
EOFError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/u01/airflow-venv/lib/python3.8/site-packages/airflow/models/taskinstance.py", line 1137, in _run_raw_task
    self._prepare_and_execute_task_with_callbacks(context, task)
  File "/u01/airflow-venv/lib/python3.8/site-packages/airflow/models/taskinstance.py", line 1311, in _prepare_and_execute_task_with_callbacks
    result = self._execute_task(context, task_copy)
  File "/u01/airflow-venv/lib/python3.8/site-packages/airflow/models/taskinstance.py", line 1336, in _execute_task
    result = task_copy.execute(context=context)
  File "/u01/airflow-venv/lib/python3.8/site-packages/airflow/providers/ssh/operators/ssh.py", line 171, in execute
    raise AirflowException(f"SSH operator error: {str(e)}")
airflow.exceptions.AirflowException: SSH operator error: 

--- 编辑---

generate_report = SSHOperator(
    task_id = 'generate_report',
    ssh_conn_id = 'ssh_123',
    command = curl -u user:password "http://localhost:1234/path/to/trigger/report_creation_API?async=false",
)

【问题讨论】:

  • 错误文件描述符错误通常发生在写入已关闭的套接字、从只写套接字读取或写入只读套接字时。发布minimal viable example 以帮助我们重现您的错误。
  • 不幸的是,此错误仅在 Airflow 的 SSHOpertaor 成功运行并完成其工作时才会发生。因此,我没有可以定期重现错误的代码,SSHOperator 的代码已更新以获取更多信息。
  • 这听起来像环境,那么。发布有关代码运行位置的更多详细信息 - 例如,它是否在容器中?您正在通过 SSH 连接的机器是否会抢先关闭连接?
  • SSHOperator 需要ssh_conn_id,你能跟踪连接 ID 发生了什么吗?很可能会过早关闭。
  • 您也可以尝试移动到您自己的SSHHook,看看是否会导致同样的问题。你可以试试keepalivetimeout 看看是否能解决问题。

标签: python ssh airflow paramiko


【解决方案1】:

这是 paramiko 库中的竞争条件。在此关闭上方的一行我们在读取时调用关闭,并且在同一方法的最开始我们在写入通道上调用关闭。这意味着在第二次关闭后,通道应该关闭,这很可能是 paramiko 库中发生的事情。

然而,这似乎是在一个单独的线程中异步发生的。根据哪个线程先获得,当我们在操作符中调用close() 时,套接字可能已经关闭。如果 paramiko 中的异步线程更快,我们正在尝试关闭一个已经关闭的套接字并抛出错误。

这是一个经典的race 条件。

由于关闭关闭的连接基本上是无操作操作,我们可以放心地忽略这样的异常。这就是我刚刚在 PR 中所做的:

https://github.com/apache/airflow/pull/17528

它最有可能在下一波供应商中发布(很可能在 8 月)。

【讨论】:

  • 那么我们是否应该将当前的错误消息视为误报并等待下一次提供程序更新(我的版本:2.0.0)?
  • 测试。这是一场虚惊。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 2011-09-08
  • 2016-10-17
  • 2013-03-20
  • 1970-01-01
相关资源
最近更新 更多