Airflow 如何预防;执行失败:[Errno 32]管道破裂“;在气流中

Airflow 如何预防;执行失败:[Errno 32]管道破裂“;在气流中,airflow,Airflow,我刚开始使用气流来协调ETL管道 我在运行dag时遇到管道错误 我看到了一个普遍的讨论 我的案子更倾向于气流方面。根据该帖子中的讨论,可能的根本原因是: 如果您的请求被阻止或被拒绝,则通常会发生断管错误 花费的时间太长,在请求端超时后,它将关闭 然后,当响应端(服务器)尝试写入 插座,它会抛出一个管道断裂的错误 这可能是真正的原因,在我的案例中,我有一个pythonoperator,它将在气流之外开始另一项工作,而且这项工作可能非常长(即10多个小时),我想知道气流中的机制是什么,我可以利用它来

我刚开始使用气流来协调ETL管道

我在运行dag时遇到管道错误

我看到了一个普遍的讨论

我的案子更倾向于气流方面。根据该帖子中的讨论,可能的根本原因是:

如果您的请求被阻止或被拒绝,则通常会发生断管错误 花费的时间太长,在请求端超时后,它将关闭 然后,当响应端(服务器)尝试写入 插座,它会抛出一个管道断裂的错误

这可能是真正的原因,在我的案例中,我有一个pythonoperator,它将在气流之外开始另一项工作,而且这项工作可能非常长(即10多个小时),我想知道气流中的机制是什么,我可以利用它来防止这个错误

有人能帮忙吗

更新1 20190303-1:

感谢SSHOperator的@y2k shubham,我能够使用它成功地建立SSH连接,并且能够在远程站点上运行一些简单的命令(实际上,默认SSH连接必须设置为localhost,因为作业在本地主机上),并且能够看到
主机名的正确结果,
pwd

但是,当我尝试运行实际作业时,我收到了相同的错误,同样,错误来自jpipeline ob,而不是气流dag/任务

更新2:20190303-2


我成功运行了一次(气流测试),没有出现错误,然后在管道中执行了另一次失败的运行(调度程序),并出现了相同的错误

虽然我建议您继续寻找一种更优雅的方式来实现您的目标,但我还是按照要求提供了示例用法


首先,您必须创建一个。这可以通过两种方式实现

  • 传统的方法是,从实例化钩子的客户机代码中提供所有必需的设置,如主机、用户、密码(如果需要)等。我在此引用一个例子,但你必须彻底地通过
    SSHHook
    及其测试,以了解所有可能的用法

  • 将所有连接详细信息放在可以从UI管理的对象中,并且只传递它的
    conn\u id
    来实例化钩子

    当然,如果您依赖于
    SSHOperator
    ,那么您可以直接将
    ssh\u conn\u id
    传递给操作员


现在,如果您计划有一个专用任务,用于通过
SSH
运行命令,您可以使用。我再次引用了一个来自的例子,但是为了更好的描述,我要通读资料来源


但是,您可能希望在SSH上运行命令,作为更大任务的一部分。在这种情况下,您不需要
SSHOperator
,仍然可以只使用
SSHHook
SSHHook
方法为您提供了的一个实例。有了它,您可以使用call运行命令


如果您查看
SSHOperator
的方法,它是一段相当复杂(但健壮)的代码,试图实现一件非常简单的事情。为了我自己的使用,我创造了一些你可能想看的东西

  • 要独立于
    SSHOperator
    使用
    SSHHook
    ,请查看
    ssh_utils.py
  • 对于通过SSH运行多个命令的操作员(您可以通过使用来实现相同的目的),请参阅
    MultiCmdSSHOperator

虽然我建议您继续寻找一种更优雅的方式来尝试实现您想要的,但我会根据要求提供示例用法


首先,您必须创建一个。这可以通过两种方式实现

  • 传统的方法是,从实例化钩子的客户机代码中提供所有必需的设置,如主机、用户、密码(如果需要)等。我在此引用一个例子,但你必须彻底地通过
    SSHHook
    及其测试,以了解所有可能的用法

  • 将所有连接详细信息放在可以从UI管理的对象中,并且只传递它的
    conn\u id
    来实例化钩子

    当然,如果您依赖于
    SSHOperator
    ,那么您可以直接将
    ssh\u conn\u id
    传递给操作员


现在,如果您计划有一个专用任务,用于通过
SSH
运行命令,您可以使用。我再次引用了一个来自的例子,但是为了更好的描述,我要通读资料来源


但是,您可能希望在SSH上运行命令,作为更大任务的一部分。在这种情况下,您不需要
SSHOperator
,仍然可以只使用
SSHHook
SSHHook
方法为您提供了的一个实例。有了它,您可以使用call运行命令


如果您查看
SSHOperator
的方法,它是一段相当复杂(但健壮)的代码,试图实现一件非常简单的事情。为了我自己的使用,我创造了一些你可能想看的东西

  • 要独立于
    SSHOperator
    使用
    SSHHook
    ,请查看
    ssh_utils.py
  • 对于通过SSH运行多个命令的操作员(您可以通过使用来实现相同的目的),请参阅
    MultiCmdSSHOperator

我已经通过
气流
SSHHook
)在远程系统上运行了
bash
脚本(
Hadoop
作业),当磁盘(远程系统上)用完时,这些脚本被卡住了7-8个小时,并且在我手动删除数据后恢复。尽管hadoop
作业附带了
纱线
的优点,即使在卡住的情况下也能保持事物的活力,并优雅地恢复一切。但也有助于防止气流结束时超时。因此,从
PythonOperator
移动到
SSHOperator
可能会
ssh_hook = SSHHook(remote_host="remote_host",
                   port="port",
                   username="username",
                   timeout=10,
                   key_file="fake.file")
ssh_hook = SSHHook(ssh_conn_id="my_ssh_conn_id")
ssh_operator = SSHOperator(ssh_conn_id="my_ssh_conn_id")
 task = SSHOperator(task_id="test",
                    command="echo -n airflow",
                    dag=self.dag,
                    timeout=10,
                    ssh_conn_id="ssh_default")
my_command = "echo airflow"
stdin, stdout, stderr = ssh_client.exec_command(
  command=my_command,
  get_pty=my_command.startswith("sudo"),
  timeout=10)