Azure 数据工厂 - 清理批处理任务文件

Azure Data Factory - Clean Up Batch Task Files

我正在使用 Azure Data Factory v2,使用带有专用节点的批处理帐户池进行处理。随着时间的推移,我发现 Batch Activity 由于节点上的 D:/ 临时驱动器上没有更多 space 而失败。对于每个 ADF 作业,它都会在节点上创建一个工作目录,作业完成后我发现它不会清理文件。想知道以前是否有人遇到过这个问题,最好的解决方案是什么。

编辑:现在似乎是 ADF 中的文件保留设置,但在我提出问题时并不存在。对于未来遇到同样问题的任何人来说,这是一个可能的解决方案。

任务清理在任务被删除或任务保留时间结束时完成 (https://docs.microsoft.com/en-us/rest/api/batchservice/task/add#taskconstraints)。这些中的任何一个都应该可以解决您遇到的问题。

注意:在最新的 REST API(2018-12-01.8.0) 中,默认保留时间已从无限减少到 7 天,以默认允许任务清理。使用此版本之前的版本创建的任务将没有此新默认值。

想出了一个解决方案,张贴希望能帮助下一个出现的人。

我找到了 Azure Python SDK for Batch,我创建了一个小脚本,它将遍历帐户上的所有池和节点,并删除工作项目录中超过 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)

我是 Azure 数据工厂的一名工程师。我们使用早于 2018-12-01.8.0 的 Azure Batch SDK,因此如前所述,通过 ADF 创建的 Batch 任务默认为无限保留期。 我们推出了一个修复程序,将通过 ADF 创建的 Batch 任务的保留期默认设置为 30 天,并且还在自定义 activity 的 typeProperties 中引入了 属性,retentionTimeInDays,客户可以设置在他们的 ADF 管道中覆盖此默认值。推出后,https://docs.microsoft.com/en-us/azure/data-factory/transform-data-using-dotnet-custom-activity#custom-activity 处的文档将更新更多详细信息。感谢您的耐心等待。

通过 ARM 模板部署时,您可以在 typeProperties 中使用 retentionTimeInDays 配置。

请注意,您应该在 Double 中提供配置 retentionTimeInDays 而不是 String