复制活动中的数据一致性验证

适用于: Azure 数据工厂

当你将数据从源存储移动到目标存储时,复制活动提供了一个选项,供你执行额外的数据一致性验证,以确保数据不仅成功地从源存储复制到目标存储,而且验证了源存储和目标存储之间的一致性。 在数据移动过程中发现不一致的文件后,可以中止复制活动,或者通过启用容错设置跳过不一致的文件来继续复制其余文件。 通过在复制活动中启用会话日志设置,可以获取跳过的文件名称。 有关更多详细信息,可以参阅复制活动中的会话日志

支持的数据存储和方案

  • 除 FTP、sFTP 和 HTTP 外,所有连接器都支持数据一致性验证。
  • 临时复制方案不支持数据一致性验证。
  • 复制二进制文件时,只有在复制活动中设置了“PreserveHierarchy”行为,数据一致性验证才可用。
  • 在启用了数据一致性验证的单个复制活动中复制多个二进制文件时,可以选择中止复制活动,或通过启用容错设置跳过不一致的文件来继续复制其余文件。
  • 在启用了数据一致性验证的单个复制活动中复制表时,如果从源读取的行数与复制到目标的行数和跳过的不兼容行数之和不同,复制活动将失败。

配置

以下示例提供了一个 JSON 定义,用于在复制活动中启用数据一致性验证:

"typeProperties": { 
"source": { 
        "type": "BinarySource", 
        "storeSettings": { 
            "type": "AzureDataLakeStoreReadSettings", 
            "recursive": true 
        } 
    }, 
    "sink": { 
        "type": "BinarySink", 
        "storeSettings": { 
            "type": "AzureDataLakeStoreWriteSettings" 
        } 
}, 
    "validateDataConsistency": true, 
    "skipErrorFile": { 
        "dataInconsistency": true 
    }, 
    "logSettings": {
        "enableCopyActivityLog": true,
        "copyActivityLogSettings": {
            "logLevel": "Warning",
            "enableReliableLogging": false
        },
        "logLocationSettings": {
            "linkedServiceName": {
               "referenceName": "ADLSGen2",
               "type": "LinkedServiceReference"
            },
            "path": "sessionlog/"
        }
    }
} 
属性 说明 允许的值 必须
validateDataConsistency 如果将此属性设置为 true,则在复制二进制文件时,复制活动将检查从源存储复制到目标存储的每个二进制文件的文件大小、lastModifiedDate 和 MD5 校验和,以确保源存储和目标存储之间的数据一致性。 复制表格数据时,复制活动将检查作业完成后的总行计数,以确保从源中读取的行数与复制到目标的行数和跳过的不兼容行数之和相同。 请注意,启用此选项会影响复制性能。 True
False(默认值)
dataInconsistency SkipErrorFile 属性包中的一个键值对,用于确定是否要跳过不一致的文件。
-True:要通过跳过不一致的文件来复制其余文件。
-False:找到不一致的文件后要中止复制活动。
请注意,只有在你复制二进制文件并将 validateDataConsistency 设置为 True 时,此属性才有效。
True
False(默认值)
logSettings 一组属性,可以指定这些属性以使会话日志能够记录跳过的文件。
linkedServiceName Azure Blob 存储Azure Data Lake Storage Gen2 的链接服务,用于存储会话日志文件。 AzureBlobStorageAzureBlobFS 类型链接服务的名称,指代用于存储日志文件的实例。
path 日志文件的路径。 指定用于存储日志文件的路径。 如果未提供路径,服务会为用户创建一个容器。

备注

  • 从/向 Azure Blob 或 Azure Data Lake Storage Gen2 复制二进制文件时,服务会利用 Azure Blob APIAzure Data Lake Storage Gen2 API 来进行块级 MD5 校验和验证。 如果 Azure Blob 或 Azure Data Lake Storage Gen2 上存在用作数据源的基于文件的 ContentMD5,则服务在读取文件后也会进行文件级 MD5 校验和验证。 将文件复制到作为数据目标的 Azure Blob 或 Azure Data Lake Storage Gen2 之后,服务会将 ContentMD5 写入 Azure Blob 或 Azure Data Lake Storage Gen2,下游应用程序可以进一步使用 ContentMD5 进行数据一致性验证。
  • 服务在任何存储区存储之间复制二进制文件时,会进行文件大小验证。

监视

自定义活动的输出

复制活动完全运行后,可以从每个复制活动运行的输出中看到数据一致性验证的结果:

"output": {
            "dataRead": 695,
            "dataWritten": 186,
            "filesRead": 3,  
            "filesWritten": 1, 
            "filesSkipped": 2, 
            "throughput": 297,
            "logFilePath": "myfolder/a84bf8d4-233f-4216-8cb5-45962831cd1b/",
            "dataConsistencyVerification": 
           { 
                "VerificationResult": "Verified", 
                "InconsistentData": "Skipped" 
           } 
        }

可以从“dataConsistencyVerification 属性”中查看数据一致性验证的详细信息。

VerificationResult 的值:

  • 已验证:已验证复制的数据在源存储和目标存储之间是否一致。
  • 未验证:由于未在复制活动中启用 validateDataConsistency,因此尚未验证复制的数据是否一致。
  • 不支持:尚未验证复制的数据是否一致,因为此特定副本对不支持数据一致性验证。

InconsistentData 的值:

  • 已发现:ADF 复制活动发现了不一致的数据。
  • 已跳过:ADF 复制活动发现并跳过了不一致的数据。
  • :ADF 复制活动未发现任何不一致的数据。 这可能是因为已验证你的数据在源存储和目标存储之间是一致的,也可能是因为你在复制活动中禁用了 validateDataConsistency。

复制活动的会话日志

如果配置为记录不一致的文件,则可以从以下路径找到日志文件:https://[your-blob-account].blob.core.chinacloudapi.cn/[path-if-configured]/copyactivity-logs/[copy-activity-name]/[copy-activity-run-id]/[auto-generated-GUID].csv。 日志文件只能是 csv 文件。

日志文件的架构如下所示:

说明
时间戳 服务跳过不一致文件时的时间戳。
级别 此项的日志级别。 对于显示文件跳过的项,它将处于“警告”级别。
OperationName 每个文件的复制活动操作行为。 它将为“FileSkip”,以指定要跳过的文件。
OperationItem 要跳过的文件名。
Message 说明为何要跳过文件的详细信息。

日志文件的示例如下所示:

Timestamp, Level, OperationName, OperationItem, Message
2020-02-26 06:22:56.3190846, Warning, FileSkip, "sample1.csv", "File is skipped after read 548000000 bytes: ErrorCode=DataConsistencySourceDataChanged,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Source file 'sample1.csv' is changed by other clients during the copy activity run.,Source=,'." 

从上面的日志文件中,你可以看到 sample1.csv 已跳过,因为无法验证它在源存储和目标存储之间是否一致。 可以获取有关 sample1.csv 变得不一致的原因的更多详细信息,这是因为当复制活动同时复制时,其他应用程序正在更改该文件。

后续步骤

请参阅其他复制活动文章: