复制活动中的数据一致性验证
适用于:Azure 数据工厂 Azure Synapse Analytics
当你将数据从源存储移动到目标存储时,复制活动提供一个选项来供你执行进一步数据一致性验证,以确保数据不仅成功地从源存储复制到目标存储,而且验证了源存储和目标存储之间的一致性。 在数据移动过程中发现不一致的文件后,可以中止复制活动,或者通过启用容错设置跳过不一致的文件来继续复制其余文件。 通过在复制活动中启用会话日志设置,可以获取跳过的文件名称。 有关更多详细信息,可以参阅复制活动中的会话日志。
支持的数据存储和方案
- 除 FTP、SFTP、HTTP、Snowflake、Office 365 和 Azure Databricks Delta Lake 之外,其他所有连接器都支持数据一致性验证。
- 临时复制方案不支持数据一致性验证。
- 复制二进制文件时,只有在复制活动中设置了“PreserveHierarchy”行为,数据一致性验证才可用。
- 在启用了数据一致性验证的单个复制活动中复制多个二进制文件时,可以选择中止复制活动,或通过启用容错设置跳过不一致的文件来继续复制其余文件。
- 在启用了数据一致性验证的单个复制活动中复制表时,如果从源读取的行数与复制到目标的行数和跳过的不兼容行数之和不同,复制活动将失败。
配置
以下示例提供了一个 JSON 定义,用于在复制活动中启用数据一致性验证:
{
"name":"CopyActivityDataConsistency",
"type":"Copy",
"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 的链接服务,用于存储会话日志文件。 | AzureBlobStorage 或 AzureBlobFS 类型链接服务的名称,指代用于存储日志文件的实例。 |
否 |
path | 日志文件的路径。 | 指定用于存储日志文件的路径。 如果未提供路径,服务会为用户创建一个容器。 | 否 |
注意
- 将二进制文件复制到 Azure Blob 或 Azure Data Lake Storage Gen2 时(或从中复制二进制文件时),此服务会利用 Azure Blob API 和 Azure 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 的值:
- Found:复制活动发现了不一致的数据。
- Skipped:复制活动发现并跳过了不一致的数据。
- 无:复制活动未发现任何不一致的数据。 这可能是因为已验证你的数据在源存储和目标存储之间是一致的,也可能是因为你在复制活动中禁用了 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 变得不一致的原因的更多详细信息,这是因为当复制活动同时复制时,其他应用程序正在更改 sample1.csv。
相关内容
请参阅其他复制活动文章: