Michael Green Asked: 2021-06-04 05:23:32 +0800 CST2021-06-04 05:23:32 +0800 CST 2021-06-04 05:23:32 +0800 CST 任务是如何分配给 ForEach 迭代的 772 Lookup-ForEach 模式在 Azure 数据工厂 (ADF) 中很常见。Lookup 产生的项目如何分配给 ForEach 的工人,其数量由 Batch Count 控制? azure azure-data-factory 1 个回答 Voted Best Answer Michael Green 2021-06-04T05:23:32+08:002021-06-04T05:23:32+08:00 它们按照 Lookup 生成的顺序循环分配。虽然我找不到任何文件来断言这一点,但这是我的观察。我可以用一个简单的例子可靠地重现它。 在新管道中,我添加了一个数组变量 ForEach,并在 ForEach 内部添加了一个 Wait(管道 JSON 包含在末尾)。数组变量提供 ForEach 的项目。尽管问题提到了查找,但使用数组变量时结果是相同的。等待的持续时间由数组的值决定,只是为了随着时间的推移分散迭代以使它们更容易观察到。 我运行了管道并收集了 ADF 输出。我使用 Duration 来计算结束时间(以 mm:ss 显示如下)。我又添加了三列,每个“工人”一列。为了了解哪个工人执行了哪个迭代,我遵循了 Start-End 链。 Task Start Duration End A B C ========== ============================ ======== ===== = = = 9 Wait1 2021-06-01T05:17:39.6100287Z 00:01:32 19:11 c 8 Wait1 2021-06-01T05:17:09.3290518Z 00:01:32 18:41 b 7 Wait1 2021-06-01T05:16:40.6095309Z 00:01:32 18:12 a 6 Wait1 2021-06-01T05:16:07.9623704Z 00:01:32 17:39 c 5 Wait1 2021-06-01T05:15:37.7842636Z 00:01:32 17:09 b 4 Wait1 2021-06-01T05:15:07.9421207Z 00:01:32 16:39 a 3 Wait1 2021-06-01T05:15:06.3028589Z 00:01:02 16:08 c 2 Wait1 2021-06-01T05:15:06.3028589Z 00:00:32 15:38 b 1 Wait1 2021-06-01T05:15:06.2872305Z 00:00:02 15:08 a ForEach1 2021-06-01T05:15:05.896518Z 00:04:06 我任意将任务 1 分配给工人 A。它在 15:08 完成,所以我找到了一个从那时开始的任务(在报告的持续时间的精度内),即任务 4,并将其也分配给工人 A,依此类推。任务 2 和 3 类似地启动它们自己的链。产生的模式是循环分配的模式。 这种对更复杂的工作负载的分析,涉及更多的任务、更大的批处理计数和不同的持续时间,为循环分配产生了相同的证据。例如,当 Batch Count 为 20 时提供 21 个任务,我看到第 21 个任务在第一个任务完成之前永远不会开始。 { "name": "ForEach RoundRobin Demo", "properties": { "activities": [ { "name": "ForEach1", "type": "ForEach", "dependsOn": [], "userProperties": [], "typeProperties": { "items": { "value": "@variables('Intervals')", "type": "Expression" }, "batchCount": 3, "activities": [ { "name": "Wait1", "type": "Wait", "dependsOn": [], "userProperties": [], "typeProperties": { "waitTimeInSeconds": { "value": "@item()", "type": "Expression" } } } ] } } ], "variables": { "Intervals": { "type": "Array", "defaultValue": [ 1, 30, 60, 180, 180, 180, 180, 180, 180 ] } }, "annotations": [] } }
它们按照 Lookup 生成的顺序循环分配。虽然我找不到任何文件来断言这一点,但这是我的观察。我可以用一个简单的例子可靠地重现它。
在新管道中,我添加了一个数组变量 ForEach,并在 ForEach 内部添加了一个 Wait(管道 JSON 包含在末尾)。数组变量提供 ForEach 的项目。尽管问题提到了查找,但使用数组变量时结果是相同的。等待的持续时间由数组的值决定,只是为了随着时间的推移分散迭代以使它们更容易观察到。
我运行了管道并收集了 ADF 输出。我使用 Duration 来计算结束时间(以 mm:ss 显示如下)。我又添加了三列,每个“工人”一列。为了了解哪个工人执行了哪个迭代,我遵循了 Start-End 链。
我任意将任务 1 分配给工人 A。它在 15:08 完成,所以我找到了一个从那时开始的任务(在报告的持续时间的精度内),即任务 4,并将其也分配给工人 A,依此类推。任务 2 和 3 类似地启动它们自己的链。产生的模式是循环分配的模式。
这种对更复杂的工作负载的分析,涉及更多的任务、更大的批处理计数和不同的持续时间,为循环分配产生了相同的证据。例如,当 Batch Count 为 20 时提供 21 个任务,我看到第 21 个任务在第一个任务完成之前永远不会开始。