Azure Data Factory 및 Azure Synapse Analytics에서 작업 삭제

적용 대상: Azure Data Factory Azure Synapse Analytics

기업용 올인원 분석 솔루션인 Microsoft Fabric의 Data Factory를 사용해 보세요. Microsoft Fabric은 데이터 이동부터 데이터 과학, 실시간 분석, 비즈니스 인텔리전스 및 보고에 이르기까지 모든 것을 다룹니다. 무료로 새 평가판을 시작하는 방법을 알아봅니다!

Azure Data Factory의 삭제 작업을 사용하여 온-프레미스 스토리지 저장소 또는 클라우드 스토리지 저장소에서 파일 또는 폴더를 삭제할 수 있습니다. 이 작업을 사용하여 파일이 더 이상 필요하지 않은 경우 파일을 클린 보관합니다.

Warning

삭제된 파일 또는 폴더는 복원할 수 없습니다(스토리지에 일시 삭제를 사용하도록 설정하지 않은 경우). 삭제 작업을 사용하여 파일 또는 폴더를 삭제할 때는 주의해야 합니다.

모범 사례

다음은 삭제 작업을 사용하기 위한 몇 가지 권장 사항입니다.

  • 나중에 복원해야 하는 경우 삭제 작업으로 파일을 삭제하기 전에 파일을 백업합니다.

  • 서비스에 스토리지 저장소에서 폴더 또는 파일을 삭제하기 위한 쓰기 권한이 있는지 확인합니다.

  • 동시에 작성 중인 파일을 삭제하지 않는지 확인합니다.

  • 온-프레미스 시스템에서 파일 또는 폴더를 삭제하려면 버전이 3.14보다 큰 자체 호스팅 통합 런타임을 사용하고 있는지 확인합니다.

지원되는 데이터 저장소

UI를 사용하여 삭제 작업 만들기

파이프라인에서 삭제 작업을 사용하려면 다음 단계를 완료합니다.

  1. 파이프라인 작업 창에서 삭제를 검색하고 삭제 작업을 파이프라인 캔버스로 끌어옵니다.

  2. 아직 선택되지 않은 경우 캔버스에서 새 삭제 작업과 해당 원본 탭을 선택하여 세부 정보를 편집합니다.

    Shows the UI for a Delete activity.

  3. 기존 항목을 선택하거나 삭제할 파일을 지정하는 새 데이터 세트를 만듭니다. 여러 파일을 선택한 경우 필요에 따라 재귀 삭제를 활성화하여 자식 폴더의 데이터도 삭제합니다. 작업에 대한 최대 동시 연결 수를 지정할 수도 있습니다.

  4. 필요에 따라 로깅 설정 탭을 선택하고 기존 로깅을 선택하거나 새 로깅 계정 연결된 서비스 위치를 만들어 수행된 삭제 작업의 결과를 기록하여 로깅을 구성합니다.

    Shows the  Logging settings  tab for a Delete activity.

구문

{
    "name": "DeleteActivity",
    "type": "Delete",
    "typeProperties": {
        "dataset": {
            "referenceName": "<dataset name>",
            "type": "DatasetReference"
        },
        "storeSettings": {
            "type": "<source type>",
            "recursive": true/false,
            "maxConcurrentConnections": <number>
        },
        "enableLogging": true/false,
        "logStorageSettings": {
            "linkedServiceName": {
                "referenceName": "<name of linked service>",
                "type": "LinkedServiceReference"
            },
            "path": "<path to save log file>"
        }
    }
}

형식 속성

속성 설명 필수
데이터 세트 삭제할 파일이나 폴더를 결정하기 위한 데이터 세트 참조를 제공합니다.
재귀 파일이 하위 폴더에서 재귀적으로 삭제되는지 또는 지정된 폴더에서만 삭제되는지 여부를 나타냅니다. 아니요. 기본값은 false입니다.
maxConcurrent커넥트ions 폴더 또는 파일을 삭제하기 위해 스토리지 저장소에 동시에 연결할 연결 수입니다. 아니요. 기본값은 1입니다.
로깅 사용 삭제된 폴더 또는 파일 이름을 기록해야 하는지 여부를 나타냅니다. true이면 로그 파일을 읽어 삭제 작업 동작을 추적할 수 있도록 로그 파일을 저장할 스토리지 계정을 추가로 제공해야 합니다. 아니요
logStorage설정 enablelogging = true인 경우에만 적용할 수 있습니다.

삭제 작업에서 삭제한 폴더 또는 파일 이름을 포함하는 로그 파일을 저장할 위치를 지정할 수 있는 스토리지 속성 그룹입니다.
아니요
linkedServiceName enablelogging = true인 경우에만 적용할 수 있습니다.

Azure Storage, Azure Data Lake Storage Gen1 또는 Azure Data Lake Storage Gen2의 연결된 서비스는 삭제 작업으로 삭제된 폴더 또는 파일 이름을 포함하는 로그 파일을 저장합니다. 삭제 작업에서 파일을 삭제하는 데 사용되는 것과 동일한 유형의 Integration Runtime으로 구성해야 합니다.
아니요
경로 enablelogging = true인 경우에만 적용할 수 있습니다.

스토리지 계정에 로그 파일을 저장할 경로입니다. 경로를 제공하지 않으면 서비스에서 컨테이너를 만듭니다.
아니요

모니터링

삭제 작업의 결과를 보고 모니터링할 수 있는 두 가지 위치가 있습니다.

  • 삭제 작업의 출력에서
  • 로그 파일에서

삭제 작업의 샘플 출력

{ 
  "datasetName": "AmazonS3",
  "type": "AmazonS3Object",
  "prefix": "test",
  "bucketName": "adf",
  "recursive": true,
  "isWildcardUsed": false,
  "maxConcurrentConnections": 2,  
  "filesDeleted": 4,
  "logPath": "https://sample.blob.core.windows.net/mycontainer/5c698705-a6e2-40bf-911e-e0a927de3f07",
  "effectiveIntegrationRuntime": "MyAzureIR (West Central US)",
  "executionDuration": 650
}

삭제 작업의 샘플 로그 파일

이름 범주 상태 오류
test1/yyy.json 파일 삭제됨
test2/hello789.txt 파일 삭제됨
test2/test3/hello000.txt 파일 삭제됨
test2/test3/zzz.json 파일 삭제됨

삭제 작업 사용 예제

특정 폴더 또는 파일 삭제

저장소의 폴더 구조는 다음과 같습니다.

루트/
    Folder_A_1/
        1.txt
        2.txt
        3.csv
    Folder_A_2/
        4.txt
        5.csv
        Folder_B_1/
            6.txt
            7.csv
        Folder_B_2/
            8.txt

이제 삭제 작업을 사용하여 데이터 세트의 다른 속성 값과 삭제 작업의 조합으로 폴더 또는 파일을 삭제합니다.

folderPath fileName 재귀 출력
루트/Folder_A_2 NULL False 루트/
    Folder_A_1/
        1.txt
        2.txt
        3.csv
    Folder_A_2/
        4.txt
        5.csv
        Folder_B_1/
            6.txt
            7.csv
        Folder_B_2/
            8.txt
루트/Folder_A_2 NULL True 루트/
    Folder_A_1/
        1.txt
        2.txt
        3.csv
    Folder_A_2/
        4.txt
        5.csv
        Folder_B_1/
            6.txt
            7.csv
        Folder_B_2/
            8.txt
루트/Folder_A_2 *.Txt False 루트/
    Folder_A_1/
        1.txt
        2.txt
        3.csv
    Folder_A_2/
        4.txt
        5.csv
        Folder_B_1/
            6.txt
            7.csv
        Folder_B_2/
            8.txt
루트/Folder_A_2 *.Txt True 루트/
    Folder_A_1/
        1.txt
        2.txt
        3.csv
    Folder_A_2/
        4.txt
        5.csv
        Folder_B_1/
            6.txt
            7.csv
        Folder_B_2/
            8.txt

시간 분할된 폴더 또는 파일을 주기적으로 클린

파이프라인을 만들어 시간 분할된 폴더 또는 파일을 주기적으로 클린 수 있습니다. 예를 들어 폴더 구조는 다음과 /mycontainer/2018/12/14/*.csv유사합니다. 일정 트리거의 서비스 시스템 변수를 사용하여 각 파이프라인 실행에서 삭제해야 하는 폴더 또는 파일을 식별할 수 있습니다.

샘플 파이프라인

{
    "name":"cleanup_time_partitioned_folder",
    "properties":{
        "activities":[
            {
                "name":"DeleteOneFolder",
                "type":"Delete",
                "dependsOn":[

                ],
                "policy":{
                    "timeout":"7.00:00:00",
                    "retry":0,
                    "retryIntervalInSeconds":30,
                    "secureOutput":false,
                    "secureInput":false
                },
                "userProperties":[

                ],
                "typeProperties":{
                    "dataset":{
                        "referenceName":"PartitionedFolder",
                        "type":"DatasetReference",
                        "parameters":{
                            "TriggerTime":{
                                "value":"@formatDateTime(pipeline().parameters.TriggerTime, 'yyyy/MM/dd')",
                                "type":"Expression"
                            }
                        }
                    },
                    "logStorageSettings":{
                        "linkedServiceName":{
                            "referenceName":"BloblinkedService",
                            "type":"LinkedServiceReference"
                        },
                        "path":"mycontainer/log"
                    },
                    "enableLogging":true,
                    "storeSettings":{
                        "type":"AzureBlobStorageReadSettings",
                        "recursive":true
                    }
                }
            }
        ],
        "parameters":{
            "TriggerTime":{
                "type":"string"
            }
        },
        "annotations":[

        ]
    }
}

샘플 데이터 세트

{
    "name":"PartitionedFolder",
    "properties":{
        "linkedServiceName":{
            "referenceName":"BloblinkedService",
            "type":"LinkedServiceReference"
        },
        "parameters":{
            "TriggerTime":{
                "type":"string"
            }
        },
        "annotations":[

        ],
        "type":"Binary",
        "typeProperties":{
            "location":{
                "type":"AzureBlobStorageLocation",
                "folderPath":{
                    "value":"@dataset().TriggerTime",
                    "type":"Expression"
                },
                "container":{
                    "value":"mycontainer",
                    "type":"Expression"
                }
            }
        }
    }
}

샘플 트리거

{
    "name": "DailyTrigger",
    "properties": {
        "runtimeState": "Started",
        "pipelines": [
            {
                "pipelineReference": {
                    "referenceName": "cleanup_time_partitioned_folder",
                    "type": "PipelineReference"
                },
                "parameters": {
                    "TriggerTime": "@trigger().scheduledTime"
                }
            }
        ],
        "type": "ScheduleTrigger",
        "typeProperties": {
            "recurrence": {
                "frequency": "Day",
                "interval": 1,
                "startTime": "2018-12-13T00:00:00.000Z",
                "timeZone": "UTC",
                "schedule": {
                    "minutes": [
                        59
                    ],
                    "hours": [
                        23
                    ]
                }
            }
        }
    }
}

2018년 1월 1일 이전에 마지막으로 수정한 만료된 파일 정리

데이터 세트에서 "LastModified" 파일 특성 필터를 사용하여 이전 또는 만료된 파일을 클린 파이프라인을 만들 수 있습니다.

샘플 파이프라인

{
    "name":"CleanupExpiredFiles",
    "properties":{
        "activities":[
            {
                "name":"DeleteFilebyLastModified",
                "type":"Delete",
                "dependsOn":[

                ],
                "policy":{
                    "timeout":"7.00:00:00",
                    "retry":0,
                    "retryIntervalInSeconds":30,
                    "secureOutput":false,
                    "secureInput":false
                },
                "userProperties":[

                ],
                "typeProperties":{
                    "dataset":{
                        "referenceName":"BlobFilesLastModifiedBefore201811",
                        "type":"DatasetReference"
                    },
                    "logStorageSettings":{
                        "linkedServiceName":{
                            "referenceName":"BloblinkedService",
                            "type":"LinkedServiceReference"
                        },
                        "path":"mycontainer/log"
                    },
                    "enableLogging":true,
                    "storeSettings":{
                        "type":"AzureBlobStorageReadSettings",
                        "recursive":true,
                        "modifiedDatetimeEnd":"2018-01-01T00:00:00.000Z"
                    }
                }
            }
        ],
        "annotations":[

        ]
    }
}

샘플 데이터 세트

{
    "name":"BlobFilesLastModifiedBefore201811",
    "properties":{
        "linkedServiceName":{
            "referenceName":"BloblinkedService",
            "type":"LinkedServiceReference"
        },
        "annotations":[

        ],
        "type":"Binary",
        "typeProperties":{
            "location":{
                "type":"AzureBlobStorageLocation",
                "fileName":"*",
                "folderPath":"mydirectory",
                "container":"mycontainer"
            }
        }
    }
}

복사 작업 및 삭제 작업을 연결하여 파일 이동

복사 작업으로 파일을 복사하고 삭제 작업을 통해 파이프라인에서 파일을 삭제함으로써 파일을 이동할 수 있습니다. 여러 파일을 이동하려는 경우 다음 샘플과 같이 GetMetadata 작업 + 필터 작업 + Foreach 작업 + 복사 작업 + 삭제 작업을 사용할 수 있습니다.

참고 항목

폴더 경로만 포함된 데이터 세트를 정의한 후 복사 작업과 삭제 작업을 사용하여 폴더를 나타내는 동일한 데이터 세트를 참조하는 방식으로 전체 폴더를 이동할 때에는 매우 조심해야 합니다. 복사 작업과 삭제 작업 사이에 폴더에 도착하는 새 파일이 없는지 확인해야 합니다. 복사 작업이 방금 복사 작업을 완료했지만 삭제 작업이 시작되지 않은 순간에 새 파일이 폴더에 도착하면 삭제 작업은 전체 폴더를 삭제하여 대상으로 아직 복사되지 않은 이러한 새로 도착한 파일을 삭제할 수 있습니다.

샘플 파이프라인

{
    "name":"MoveFiles",
    "properties":{
        "activities":[
            {
                "name":"GetFileList",
                "type":"GetMetadata",
                "dependsOn":[

                ],
                "policy":{
                    "timeout":"7.00:00:00",
                    "retry":0,
                    "retryIntervalInSeconds":30,
                    "secureOutput":false,
                    "secureInput":false
                },
                "userProperties":[

                ],
                "typeProperties":{
                    "dataset":{
                        "referenceName":"OneSourceFolder",
                        "type":"DatasetReference",
                        "parameters":{
                            "Container":{
                                "value":"@pipeline().parameters.SourceStore_Location",
                                "type":"Expression"
                            },
                            "Directory":{
                                "value":"@pipeline().parameters.SourceStore_Directory",
                                "type":"Expression"
                            }
                        }
                    },
                    "fieldList":[
                        "childItems"
                    ],
                    "storeSettings":{
                        "type":"AzureBlobStorageReadSettings",
                        "recursive":true
                    },
                    "formatSettings":{
                        "type":"BinaryReadSettings"
                    }
                }
            },
            {
                "name":"FilterFiles",
                "type":"Filter",
                "dependsOn":[
                    {
                        "activity":"GetFileList",
                        "dependencyConditions":[
                            "Succeeded"
                        ]
                    }
                ],
                "userProperties":[

                ],
                "typeProperties":{
                    "items":{
                        "value":"@activity('GetFileList').output.childItems",
                        "type":"Expression"
                    },
                    "condition":{
                        "value":"@equals(item().type, 'File')",
                        "type":"Expression"
                    }
                }
            },
            {
                "name":"ForEachFile",
                "type":"ForEach",
                "dependsOn":[
                    {
                        "activity":"FilterFiles",
                        "dependencyConditions":[
                            "Succeeded"
                        ]
                    }
                ],
                "userProperties":[

                ],
                "typeProperties":{
                    "items":{
                        "value":"@activity('FilterFiles').output.value",
                        "type":"Expression"
                    },
                    "batchCount":20,
                    "activities":[
                        {
                            "name":"CopyAFile",
                            "type":"Copy",
                            "dependsOn":[

                            ],
                            "policy":{
                                "timeout":"7.00:00:00",
                                "retry":0,
                                "retryIntervalInSeconds":30,
                                "secureOutput":false,
                                "secureInput":false
                            },
                            "userProperties":[

                            ],
                            "typeProperties":{
                                "source":{
                                    "type":"BinarySource",
                                    "storeSettings":{
                                        "type":"AzureBlobStorageReadSettings",
                                        "recursive":false,
                                        "deleteFilesAfterCompletion":false
                                    },
                                    "formatSettings":{
                                        "type":"BinaryReadSettings"
                                    },
                                    "recursive":false
                                },
                                "sink":{
                                    "type":"BinarySink",
                                    "storeSettings":{
                                        "type":"AzureBlobStorageWriteSettings"
                                    }
                                },
                                "enableStaging":false,
                                "dataIntegrationUnits":0
                            },
                            "inputs":[
                                {
                                    "referenceName":"OneSourceFile",
                                    "type":"DatasetReference",
                                    "parameters":{
                                        "Container":{
                                            "value":"@pipeline().parameters.SourceStore_Location",
                                            "type":"Expression"
                                        },
                                        "Directory":{
                                            "value":"@pipeline().parameters.SourceStore_Directory",
                                            "type":"Expression"
                                        },
                                        "filename":{
                                            "value":"@item().name",
                                            "type":"Expression"
                                        }
                                    }
                                }
                            ],
                            "outputs":[
                                {
                                    "referenceName":"OneDestinationFile",
                                    "type":"DatasetReference",
                                    "parameters":{
                                        "Container":{
                                            "value":"@pipeline().parameters.DestinationStore_Location",
                                            "type":"Expression"
                                        },
                                        "Directory":{
                                            "value":"@pipeline().parameters.DestinationStore_Directory",
                                            "type":"Expression"
                                        },
                                        "filename":{
                                            "value":"@item().name",
                                            "type":"Expression"
                                        }
                                    }
                                }
                            ]
                        },
                        {
                            "name":"DeleteAFile",
                            "type":"Delete",
                            "dependsOn":[
                                {
                                    "activity":"CopyAFile",
                                    "dependencyConditions":[
                                        "Succeeded"
                                    ]
                                }
                            ],
                            "policy":{
                                "timeout":"7.00:00:00",
                                "retry":0,
                                "retryIntervalInSeconds":30,
                                "secureOutput":false,
                                "secureInput":false
                            },
                            "userProperties":[

                            ],
                            "typeProperties":{
                                "dataset":{
                                    "referenceName":"OneSourceFile",
                                    "type":"DatasetReference",
                                    "parameters":{
                                        "Container":{
                                            "value":"@pipeline().parameters.SourceStore_Location",
                                            "type":"Expression"
                                        },
                                        "Directory":{
                                            "value":"@pipeline().parameters.SourceStore_Directory",
                                            "type":"Expression"
                                        },
                                        "filename":{
                                            "value":"@item().name",
                                            "type":"Expression"
                                        }
                                    }
                                },
                                "logStorageSettings":{
                                    "linkedServiceName":{
                                        "referenceName":"BloblinkedService",
                                        "type":"LinkedServiceReference"
                                    },
                                    "path":"container/log"
                                },
                                "enableLogging":true,
                                "storeSettings":{
                                    "type":"AzureBlobStorageReadSettings",
                                    "recursive":true
                                }
                            }
                        }
                    ]
                }
            }
        ],
        "parameters":{
            "SourceStore_Location":{
                "type":"String"
            },
            "SourceStore_Directory":{
                "type":"String"
            },
            "DestinationStore_Location":{
                "type":"String"
            },
            "DestinationStore_Directory":{
                "type":"String"
            }
        },
        "annotations":[

        ]
    }
}

샘플 데이터 세트

GetMetadata 작업에서 파일 목록을 열거하는 데 사용하는 데이터 세트입니다.

{
    "name":"OneSourceFolder",
    "properties":{
        "linkedServiceName":{
            "referenceName":"AzureStorageLinkedService",
            "type":"LinkedServiceReference"
        },
        "parameters":{
            "Container":{
                "type":"String"
            },
            "Directory":{
                "type":"String"
            }
        },
        "annotations":[

        ],
        "type":"Binary",
        "typeProperties":{
            "location":{
                "type":"AzureBlobStorageLocation",
                "folderPath":{
                    "value":"@{dataset().Directory}",
                    "type":"Expression"
                },
                "container":{
                    "value":"@{dataset().Container}",
                    "type":"Expression"
                }
            }
        }
    }
}

복사 작업 및 삭제 작업에 사용되는 데이터 원본에 대한 데이터 세트입니다.

{
    "name":"OneSourceFile",
    "properties":{
        "linkedServiceName":{
            "referenceName":"AzureStorageLinkedService",
            "type":"LinkedServiceReference"
        },
        "parameters":{
            "Container":{
                "type":"String"
            },
            "Directory":{
                "type":"String"
            },
            "filename":{
                "type":"string"
            }
        },
        "annotations":[

        ],
        "type":"Binary",
        "typeProperties":{
            "location":{
                "type":"AzureBlobStorageLocation",
                "fileName":{
                    "value":"@dataset().filename",
                    "type":"Expression"
                },
                "folderPath":{
                    "value":"@{dataset().Directory}",
                    "type":"Expression"
                },
                "container":{
                    "value":"@{dataset().Container}",
                    "type":"Expression"
                }
            }
        }
    }
}

복사 활동에서 사용하는 데이터 대상용 데이터 세트

{
    "name":"OneDestinationFile",
    "properties":{
        "linkedServiceName":{
            "referenceName":"AzureStorageLinkedService",
            "type":"LinkedServiceReference"
        },
        "parameters":{
            "Container":{
                "type":"String"
            },
            "Directory":{
                "type":"String"
            },
            "filename":{
                "type":"string"
            }
        },
        "annotations":[

        ],
        "type":"Binary",
        "typeProperties":{
            "location":{
                "type":"AzureBlobStorageLocation",
                "fileName":{
                    "value":"@dataset().filename",
                    "type":"Expression"
                },
                "folderPath":{
                    "value":"@{dataset().Directory}",
                    "type":"Expression"
                },
                "container":{
                    "value":"@{dataset().Container}",
                    "type":"Expression"
                }
            }
        }
    }
}

여기에서 파일을 이동하는 템플릿을 가져올 수도 있습니다.

알려진 제한 사항

  • 삭제 작업은 wild카드 설명된 폴더 목록 삭제를 지원하지 않습니다.

  • 삭제 작업에서 파일 특성 필터를 사용하는 경우: modifiedDatetimeStart 및 modifiedDatetimeEnd를 사용하여 삭제할 파일을 선택하려면 삭제 작업에서도 "wild카드FileName": "*"를 설정해야 합니다.

Azure Data Factory 및 Synapse 파이프라인에서 파일을 이동하는 방법에 대해 자세히 알아봅니다.