Azure 批处理任务依赖项:从之前复制文件

Azure batch task dependencies: copy files from previous

我有一个 Azure Batch 场景,其中我有一个任务链,这些任务彼此相继 运行。依赖关系设置正确,因此它们 运行 彼此很好。

但是我需要在执行前将所有文件从之前任务的文件夹复制到新任务的文件夹。我事先不知道会有多少文件和什么文件,所以我只想复制所有内容。我找不到使用 Batch 客户端库 (https://docs.microsoft.com/en-us/dotnet/api/overview/azure/batch?view=azure-dotnet) 完成此操作的方法。

作为解决方法,我尝试向使用 commandline 执行的 .bat 文件添加一个简单的复制任务,但由于某种原因,它只复制了一些文件。在一项任务中,有几百个文件要复制,并且在停止复制(没有错误)之前复制的部分有几个百分比的变化。这是我的复制命令:$"cmd /c xcopy /E /F /Y %AZ_BATCH_TASK_WORKING_DIR%\..\..\{previousTaskId}\wd %AZ_BATCH_TASK_WORKING_DIR%"。如果直接从 VM 执行,一切正常。

经过检验的假设:

有什么想法吗?这听起来像是一个微不足道的场景,但我就是不知道该怎么做。

retentionTime 为您的任务配置了什么?

我想知道 Batch 是否在清理上一个任务(删除所有文件)的同时您的下游任务正在尝试复制它们。

一个未经测试的建议...

...假设您的任务 A 和 B 按此顺序 运行(使用任务依赖性强制执行)。

... 在任务 A 上配置 outputFile 以将 A 生成的所有文件复制到您的存储帐户中。使用通配符,以便将所有文件复制到同一个容器中。

... 在任务 B 上配置 resourceFile 以将所有文件从您的存储帐户复制到任务工作目录中。

这样做的好处是可以将中间工作文件保留在计算节点之外 - 允许您从中断的地方继续if/when某些事情会中断您的工作量。

原来问题出在前面的任务中:它启动了一个进程,该进程开始在后台生成文件并立即返回控制权。因此,批处理引擎认为任务已完成并继续执行下一个任务,该任务首先复制前一个任务生成的文件。

因此,我关于并行性的假设部分正确,尽管它在回显时间戳中不可见(第一个任务说它在第二个任务说它开始之前完成)。 sleep 的实验会揭示问题,但我要么使用了太短的睡眠延迟,要么以某种方式读取了错误的结果。

因为我无法控制第一个任务如何启动进程,所以我现在添加了一些 Windows 批处理脚本来轮询 tasklist 进程何时结束并解决了问题。