Azure Batch 中的作业删除和重新创建会引发 BatchErrorException
Job deletion and recreation in Azure Batch raises BatchErrorException
我正在 Python 中为 Azure Batch 编写任务管理器。
当我 运行 经理,并向指定的 Azure Batch 帐户添加一个作业时,我会:
- 检查指定的job id是否已经存在
- 如果是,删除作业
- 创建工作
不幸的是,我在第 2 步和第 3 步之间失败了。这是因为,即使我为指定作业发出删除命令并检查 Azure Batch 帐户中没有具有相同 ID 的作业,我也会收到 BatchErrorException当我再次尝试创建作业时如下所示:
Exception encountered:
The specified job has been marked for deletion and is being garbage collected.
我用来删除作业的代码如下:
def deleteJob(self, jobId):
print("Delete job [{}]".format(jobId))
self.__batchClient.job.delete(jobId)
# Wait until the job is deleted
# 10 minutes timeout for the operation to succeed
timeout = datetime.timedelta(minutes=10)
timeout_expiration = datetime.datetime.now() + timeout
while True:
try:
# As long as we can retrieve data related to the job, it means it is still deleting
self.__batchClient.job.get(jobId)
except batchmodels.BatchErrorException:
print("Job {jobId} deleted correctly.".format(
jobId = jobId
))
break
time.sleep(2)
if datetime.datetime.now() > timeout_expiration:
raise RuntimeError("ERROR: couldn't delete job [{jobId}] within timeout period of {timeout}.".format(
jobId = jobId
, timeout = timeout
))
我尝试检查 Azure SDK,但找不到可以准确告诉我作业何时被完全删除的方法。
查询作业是否存在是确定作业是否已从系统中删除的唯一方法。
或者,如果您不需要再次使用相同的作业 ID,则可以发出删除作业,然后创建具有不同 ID 的作业。这将允许作业从您的关键路径中异步删除。
根据您提供的异常日志信息,我认为是因为删除作业可能会消耗一定的时间,而您在此期间无法创建相同的作业id。
我建议你可以在步骤3中添加检查来创建作业,确保在创建之前帐户中没有找到具有相同id的作业.
由于您没有提供创建工作的代码,您可以参考下面的代码片段来创建工作:
import azure.batch.batch_service_client as batch
import azure.batch.batch_auth as batchauth
import azure.batch.models as batchmodels
credentials = batchauth.SharedKeyCredentials(ACCOUNT_NAME,
ACCOUNT_KEY)
batch_client = batch.BatchServiceClient(
credentials,
base_url=ACCOUNT_URL)
def createJob(jobId):
while (batch_client.job.get(jobId)):
print 'job still exists,can not be created'
else:
# Create Job
job = batchmodels.JobAddParameter(
jobId,
batchmodels.PoolInformation(pool_id='mypool')
)
batch_client.job.add(job)
print 'create success'
希望对你有帮助。
我正在 Python 中为 Azure Batch 编写任务管理器。 当我 运行 经理,并向指定的 Azure Batch 帐户添加一个作业时,我会:
- 检查指定的job id是否已经存在
- 如果是,删除作业
- 创建工作
不幸的是,我在第 2 步和第 3 步之间失败了。这是因为,即使我为指定作业发出删除命令并检查 Azure Batch 帐户中没有具有相同 ID 的作业,我也会收到 BatchErrorException当我再次尝试创建作业时如下所示:
Exception encountered:
The specified job has been marked for deletion and is being garbage collected.
我用来删除作业的代码如下:
def deleteJob(self, jobId):
print("Delete job [{}]".format(jobId))
self.__batchClient.job.delete(jobId)
# Wait until the job is deleted
# 10 minutes timeout for the operation to succeed
timeout = datetime.timedelta(minutes=10)
timeout_expiration = datetime.datetime.now() + timeout
while True:
try:
# As long as we can retrieve data related to the job, it means it is still deleting
self.__batchClient.job.get(jobId)
except batchmodels.BatchErrorException:
print("Job {jobId} deleted correctly.".format(
jobId = jobId
))
break
time.sleep(2)
if datetime.datetime.now() > timeout_expiration:
raise RuntimeError("ERROR: couldn't delete job [{jobId}] within timeout period of {timeout}.".format(
jobId = jobId
, timeout = timeout
))
我尝试检查 Azure SDK,但找不到可以准确告诉我作业何时被完全删除的方法。
查询作业是否存在是确定作业是否已从系统中删除的唯一方法。
或者,如果您不需要再次使用相同的作业 ID,则可以发出删除作业,然后创建具有不同 ID 的作业。这将允许作业从您的关键路径中异步删除。
根据您提供的异常日志信息,我认为是因为删除作业可能会消耗一定的时间,而您在此期间无法创建相同的作业id。
我建议你可以在步骤3中添加检查来创建作业,确保在创建之前帐户中没有找到具有相同id的作业.
由于您没有提供创建工作的代码,您可以参考下面的代码片段来创建工作:
import azure.batch.batch_service_client as batch
import azure.batch.batch_auth as batchauth
import azure.batch.models as batchmodels
credentials = batchauth.SharedKeyCredentials(ACCOUNT_NAME,
ACCOUNT_KEY)
batch_client = batch.BatchServiceClient(
credentials,
base_url=ACCOUNT_URL)
def createJob(jobId):
while (batch_client.job.get(jobId)):
print 'job still exists,can not be created'
else:
# Create Job
job = batchmodels.JobAddParameter(
jobId,
batchmodels.PoolInformation(pool_id='mypool')
)
batch_client.job.add(job)
print 'create success'
希望对你有帮助。