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

时间:2019-01-13 15:40:16

标签: azure-data-factory azure-batch

我正在使用带有专用节点的批处理帐户池来处理Azure Data Factory v2。我发现随着时间的推移,批处理活动失败,原因是节点上的D:/临时驱动器上没有更多空间。对于每个ADF作业,它都会在节点上创建一个工作目录,并且在作业完成后,我发现它不会清理文件。想知道以前是否有人遇到过这种情况,以及实现的最佳解决方案是什么。

编辑:似乎是当今ADF中的文件保留设置,当我提出问题时不存在。对于将来遇到同一问题的任何人,这都是可能的解决方案。

4 个答案:

答案 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