【问题标题】:Azure batch task dependencies: copy files from previousAzure 批处理任务依赖项:从以前复制文件
【发布时间】:2019-10-18 06:09:27
【问题描述】:

我有一个 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 执行,一切都会正常工作。

检验假设:

  • 复制会覆盖执行实际处理的 .bat 文件。这反过来又破坏了复制。我现在已经排除了这个问题(每个任务都有一个不同命名的 .bat 文件)
  • 出于某种原因,复制是并行完成的。我向蝙蝠添加了时间戳回声,并且没有并行性,所以这不是原因。还尝试在 xcopy 之前添加sleep 10,但没有任何区别。
  • xcopy 出于某种原因看不到所有文件。添加了一个 dir 命令来查看有哪些文件,它只查看 xcopy 复制的相同文件。
  • 用户访问问题。没有意义,因为某些文件已成功复制并且没有错误。

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

【问题讨论】:

  • 您的新任务是否需要之前任务的输出文件?
  • 是的,我无法确切知道哪些输出文件以及多少个输出文件,所以如果所有内容都被复制就可以了
  • 你是把这些文件存储在你的节点里吗?
  • 所有这些任务都在单个节点中执行。我不做并行。
  • 你能告诉我你的错误吗?我认为您可以连接到您的节点并自己手动复制文件。

标签: c# azure .net-core azure-batch


【解决方案1】:

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

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

未经测试的建议...

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

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

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

这具有将您的中间工作文件保留在计算节点之外的优势 - 如果/当某些事情中断您的工作负载时,您可以从中断的地方继续。

【讨论】:

  • 不是清理文件;如果我在虚拟机中手动执行命令,一切都很好。至于您提出的解决方案,我必须提前知道输入资源文件才能从中创建 ResourceFile - 我事先不知道它们。无论如何,我发现了问题,更多的是在我的答案中。感谢您的意见!
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    相关资源
    最近更新 更多