微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

杀死 Azure 数据工厂管道/触发器

如何解决杀死 Azure 数据工厂管道/触发器

我创建了几个并发设置为 1 的管道,并使用调度触发器触发它们。但是,如果管道未在预期时间内完成执行,则下一个运行中触发器将排队。在这种情况下,我如何杀死触发器或管道?即使我手动取消了执行,触发器/管道仍然需要额外的时间来取消。 ADF 中是否有任何方法可以直接杀死进程?

问候, 桑迪普

解决方法

我提供了两种解决方案,它们都要求并发限制 > 1(不能排队相同的管道或不起作用):

  1. 确定被触发的管道是否已经在运行。如果是,则允许已经运行的管道继续运行并终止新管道。

  2. 确定触发的管道是否已经在运行。如果是,则杀死旧的并让新的继续。 (第一个选项的反面)

这里是选项 1:

要确定被触发的管道当前是否正在运行,您可以使用 queryPipelineRuns ADF Rest API Post 命令。下面是一个例子。输出以 Json 格式返回到“值”对象下。然后您可以过滤掉当前的运行,这样如果有任何东西返回到 Queued 或 In-Progress 状态,您就知道您不应该运行这个特定的触发器。

1、创建网络请求

Get Pipelines Running or Queued

网址:https://management.azure.com/subscriptions/@{pipeline().parameters.SubscriptionId}/resourceGroups/@{pipeline().parameters.ResourceGroupName}/providers/Microsoft.DataFactory/factories/@{pipeline().DataFactory}/queryPipelineRuns?api-version=2018-06-01

身体:

{
  "lastUpdatedAfter": "2018-06-16T00:36:44.3345758Z","lastUpdatedBefore": "@{utcnow()}","filters": [

{
    "operand":"PipelineName","operator":"Equals","values":[
        "@{pipeline().parameters.PipelineName}"
        ]
    },{
    "operand":"Status","operator":"In","values":[
        "InProgress","Queued"
        ]
    }
  ]
}

2、使用管道的 runId 将 Web 请求的输出过滤为不是您当前正在运行的管道的任何内容

Web Request Output Filter

3rd,使用 IF Activity 确定 FilteredItemCount 是否大于零,如果是则强制使管道失败

仅供参考,您可以使用存储过程来创建自定义错误消息并强制执行错误,但在我的示例中,我只是在设置占位符变量值时除以零。

If Activity to Force Error if Pipeline running already

第四,在 If Activity 之后,这确实是您放置管道实际需要做的任何事情的地方,在我的情况下,我只是使用了等待活动

Where your Pipeline really starts

我对此进行了测试,效果很好。

这里是选项 2:

为了取消已经在进行中的管道。您可以从上面的第三步开始,而不是强制当前管道失败,而是使用来自其他正在进行的管道的 RunID 来取消这些管道。该命令完成后,您可以继续运行您的管道。请记住,此方法仍需要同时运行 2 个或更多。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。