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

时间:2021-07-14 09:43:00

标签: triggers azure-data-factory azure-data-factory-2 kill-process azure-data-factory-pipeline

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

问候, 桑迪普

1 个答案:

答案 0 :(得分:0)

我提供了两种解决方案,它们都要求并发限制 > 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 个或更多。