在 ADF 中,我有一个演示管道,其中包含三个活动和一个名为parentRunId 的管道变量:
管道变量
第一个活动是“设置变量”活动,并为parentRunId生成UUID:
提供带有 UUID 的变量:
第二个活动使用parentRunId将其传递到Databricks笔记本:
将变量传递到笔记本:
第三步与此示例无关。
一切正常,UUID 显示在我的 Databrick 笔记本中。
但我希望能够从第 2 步重新启动我的管道,以防失败。
因此,我在第二步中选择 ADF 监视器中的“从所选活动重新运行”按钮:
从选定的活动重新运行
我的期望是,变量parentRunId仍然是相同的(因为我不重新运行第一步,这将生成UUID)。
然而,令人惊讶的是,一个新的 UUID 被生成并传递给 Databricks。
这让我很难从故障中恢复,因为管道似乎已经失去了它的上下文。
这是一个错误吗?知道如何在活动之间传递一条信息,当我在管道中间重新启动时,这些信息也将可靠地可用吗?
这是一个错误吗?知道如何在活动之间传递一条信息,当我在管道中间重新启动时,这些信息也将可靠地可用吗?
我认为这是 ADF 中的默认性质,每当我们重新运行管道时,即使它说已跳过,设置变量活动也会再次执行。
为了达到您的要求,您可以尝试以下解决方法。但为此,您需要 Blob 存储或 ADLS 存储、复制活动和查找活动。
重新运行期间,复制活动和查找活动将被跳过。因此,首先使用复制活动将
run_id
存储在文件中,然后使用查找活动获取它。
遵循以下设计。
在 ADLS 或 Blob 中创建一个包含一列和一列的虚拟 source.csv 文件。为此创建数据集并添加为复制活动的源。在源中,通过像上面一样为其创建附加列,将您的
run_id
变量添加到源中。
将其复制到另一个 csv 文件。将该数据集添加到复制活动接收器。
现在,使用相同的目标数据集进行查找活动,如下所示。
在第一次管道运行时,复制活动将为
run_id
创建一个附加列并将其存储在目标 csv 文件中。查找活动将从同一目标数据集中给出所需的 run_id
。
您可以使用以下表达式从查找中获取该值。
@activity('Lookup1').output.value[0].run_id
这里我使用设置变量活动来代替笔记本活动。
管道正常运行:
上述管道run_id将存储在文件中。
在这里,我重新运行 Set variable2 活动。
需要旧管道run_id:
即使新的管道 run_id 存储在第一个活动中,您也可以看到它提供了所需的旧管道 run_id。
只需将最后一个活动替换为您的笔记本活动,并将相同的表达式传递给您的笔记本活动参数。