删除 Azure 批处理作业中的任务和池是否必要?

Is deleting tasks and pools necessary in Azure batch jobs?

关于清理的Azure Batch .net tutorial shows deleting tasks, then jobs, then pools. At the same time, I found this article,不是删除作业和池,而是删除不再使用的虚拟机。这是一个好策略吗?我看到它可以帮助跟踪任务和一般组织,但是在删除已完成任务的 vms 后保留任务、作业和池有什么意义?

更新2018-05-15

给定作业中的最大任务数为 7770。

我按照下面的答案,最终得到了一份累积了 7770 个任务的工作。在这个神奇的数字之后,批处理服务不再能够向作业添加新任务,抛出以下异常:

System.AggregateException: One or more errors occurred. ---> Microsoft.Azure.Batch.Common.BatchException: InternalError: Server encountered an internal error. Please try again after some time.
RequestId:e6ab60e0-5c3b-4116-9ffb-ba2032154318
Time:2018-05-15T11:17:17.2186951Z
   at Microsoft.Azure.Batch.Protocol.CloudPoolOperations.<GetAsync>d__65.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Azure.Batch.Protocol.BatchRequest`2.<ExecuteRequestWithCancellationAsync>d__c.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Azure.Batch.Protocol.BatchRequest`2.<ExecuteRequestAsync>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Azure.Batch.ProtocolLayer.<ProcessAndExecuteBatchRequest>d__11b`2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Azure.Batch.PoolOperations.<GetPoolAsync>d__3.MoveNext()
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
   at Microsoft.Azure.Batch.PoolOperations.GetPool(String poolId, DetailLevel detailLevel, IEnumerable`1 additionalBehaviors)
   at Pepe.Helpers.Batch.CreatePool()
   at Pepe.Helpers.LogEntryMaintainer.LaunchJob(LogFile log, PepeEntities db)

我建议定期清理历史数据。如果您需要在某处保留此信息,我建议您移动到某处,例如 table 存储。

您根本不需要删除任务或它们的工作,将它们留在系统中也没有真正的缺点。您 但是需要在完成时终止作业,因为 Batch 帐户中的活动作业数量有配额。

关于池和 VM,这实际上取决于您要如何管理资源(特别是考虑到这些需要花钱)。常见的方法包括;

  • 明确地为运行一个或多个作业创建一个池。完成后删除池。如果您想要 increase/decrease VM 数量,也可以显式调整池的大小。
  • 使用 Autopool 功能指定要在提交作业时自动创建的池。作业终止时,池将自动删除。
  • 明确创建一个池并定义一个自动缩放公式,该公式可以在作业提交和完成时向上和向下缩放池。这是最大化资源利用率和最小化成本的非常强大的功能。

希望对您有所帮助。