我正在使用带有专用节点的批处理帐户池来处理Azure Data Factory v2。我发现随着时间的推移,批处理活动失败,原因是节点上的D:/临时驱动器上没有更多空间。对于每个ADF作业,它都会在节点上创建一个工作目录,并且在作业完成后,我发现它不会清理文件。想知道以前是否有人遇到过这种情况,以及实现的最佳解决方案是什么。
编辑:似乎是当今ADF中的文件保留设置,当我提出问题时不存在。对于将来遇到同一问题的任何人,这都是可能的解决方案。
答案 0 :(得分:1)
想出了一个解决方案,希望能为下一个出现的人提供帮助。
我找到了用于批处理的Azure Python SDK,我创建了一个小脚本,该脚本将遍历帐户中的所有池+节点,并删除工作项目录中超过1天的任何文件。
import azure.batch as batch
import azure.batch.operations.file_operations as file_operations
from azure.batch.batch_auth import SharedKeyCredentials
import azure.batch.operations
import msrest.service_client
from datetime import datetime
program_datetime = datetime.utcnow()
batch_account = 'batchaccount001'
batch_url = 'https://batchaccount001.westeurope.batch.azure.com'
batch_key = '<BatchKeyGoesHere>'
batch_credentials = SharedKeyCredentials(batch_account, batch_key)
#Create Batch Client with which to do operations
batch_client = batch.BatchServiceClient(credentials=batch_credentials,
batch_url = batch_url
)
service_client = msrest.service_client.ServiceClient(batch_credentials, batch_client.config)
#List out all the pools
pools = batch_client.pool.list()
pool_list = [p.id for p in pools]
for p in pool_list:
nodes = batch_client.compute_node.list(p)
node_list = [n.id for n in nodes]
for n in node_list:
pool_id = p
node_id = n
print(f'Pool = {pool_id}, Node = {node_id}')
fo_client = azure.batch.operations.FileOperations(service_client,
config=batch_client.config,
serializer=batch_client._serialize,
deserializer=batch_client._deserialize)
files = fo_client.list_from_compute_node(pool_id,
node_id,
recursive=True,
file_list_from_compute_node_options=None,
custom_headers=None,
raw=False
)
for file in files:
# Check to make sure it's not a directory. Directories do not have a last_modified property.
if not file.is_directory:
file_datetime = file.properties.last_modified.replace(tzinfo=None)
file_age_in_seconds = (program_datetime - file_datetime).total_seconds()
# Delete anything older than a day in the workitems directory.
if file_age_in_seconds > 86400 and file.name.startswith('workitems'):
print(f'{file_age_in_seconds} : {file.name}')
fo_client.delete_from_compute_node(pool_id, node_id, file.name)
答案 1 :(得分:1)
我是Azure Data Factory的工程师。我们使用早于2018-12-01.8.0的Azure批处理SDK,因此通过ADF创建的批处理任务默认为无限的保留期,如前所述。 我们正在推出一个修复程序,以默认将通过ADF创建的批处理任务的保留期限默认为30天,并在自定义活动的typeProperties中引入了属性ReservationTimeInDays,客户可以在其ADF管道中进行设置以覆盖此默认值。部署完成后,https://docs.microsoft.com/en-us/azure/data-factory/transform-data-using-dotnet-custom-activity#custom-activity上的文档将更新为更多详细信息。谢谢您的耐心等候。
答案 2 :(得分:0)
在删除任务或经过任务保留时间之后,将完成任务的清理(https://docs.microsoft.com/en-us/rest/api/batchservice/task/add#taskconstraints)。这些都可以解决您遇到的问题。
注意:在最新的REST API(2018-12-01.8.0)中,默认保留时间已从无限减少为7天,以默认情况下允许清除任务。使用此之前版本创建的任务将没有新的默认值。
答案 3 :(得分:-1)
通过ARM模板进行部署时,可以在retentionTimeInDays
中使用typeProperties
配置。
请注意,您应该在retentionTimeInDays
中而不是Double
中提供配置String
。