你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
适用于:
Azure Data Factory
Azure Synapse Analytics
提示
Microsoft Fabric 中的 Data Factory 是下一代 Azure Data Factory,具有更加简化的架构、内置人工智能和新功能。 如果不熟悉数据集成,请从Fabric数据工厂开始。 现有 ADF 工作负载可以升级到 Fabric,以跨数据科学、实时分析和报告访问新功能。
可以在Copy activity中记录复制的文件名。 这不仅有助于确保数据成功从源复制到目标,而且还能验证源和目标之间的一致性。
在Copy activity中启用容错设置以跳过错误数据时,还可以记录跳过的文件和跳过的行。 可以在复制活动中的容错中获取更多详细信息。
鉴于你有机会通过启用会话日志获取由 Azure Data Factory (ADF) 的 Copy activity 复制的所有文件名,因此在以下情况下将很有帮助:
- 在使用 ADF 复制活动将文件从一个存储复制到另一个存储后,你会在目标存储中发现一些意外文件。 可以扫描Copy activity会话日志,以查看哪些活动实际复制了文件,以及何时复制。 通过这种方法,可以轻松找到根本原因并在 ADF 中修复配置。
- 在使用 ADF 复制活动将文件从一个存储复制到另一个存储后,你会发现复制到目标的文件并非来自源存储的预期文件。 可以扫描复制活动的会话日志,以获取复制作业的时间戳,并在ADF复制活动从源存储读取文件时获取文件的元数据。 通过此方法,可以确认在 ADF 复制文件后源存储上的其他应用程序是否更新了文件。
使用 Azure Data Factory Studio 进行配置
若要配置复制活动日志记录,请首先将复制活动添加到管道,然后使用其“设置”选项卡来配置日志记录和各种日志记录选项。
若要随后监视日志,可以在 ADF 工作室的“监视”选项卡的管道运行下方查看管道运行的输出。 在这里,选择要监视的管道运行,然后将鼠标悬停在活动名称旁边的区域上,这里可找到指向显示管道输入、输出(完成后)以及其他详细信息的链接的图标。
选择输出图标
以查看作业日志记录的详细信息,并记下所选存储帐户中的日志记录位置,以便在其中查看所有记录的活动的详细信息。
有关日志输出格式的详细信息,请参阅下文。
使用 JSON 进行配置
以下示例提供了一个 JSON 定义,用于在复制活动中启用会话日志:
{
"name": "CopyActivityLog",
"type": "Copy",
"typeProperties": {
"source": {
"type": "BinarySource",
"storeSettings": {
"type": "AzureDataLakeStoreReadSettings",
"recursive": true
},
"formatSettings": {
"type": "BinaryReadSettings"
}
},
"sink": {
"type": "BinarySink",
"storeSettings": {
"type": "AzureBlobFSWriteSettings"
}
},
"skipErrorFile": {
"fileForbidden": true,
"dataInconsistency": true
},
"validateDataConsistency": true,
"logSettings": {
"enableCopyActivityLog": true,
"copyActivityLogSettings": {
"logLevel": "Warning",
"enableReliableLogging": false
},
"logLocationSettings": {
"linkedServiceName": {
"referenceName": "ADLSGen2",
"type": "LinkedServiceReference"
},
"path": "sessionlog/"
}
}
}
}
| properties | 说明 | 允许的值 | 必选 |
|---|---|---|---|
| 启用复制活动日志 | 当设置为 true 时,你将有机会记录复制的文件、跳过的文件或跳过的行。 | 为真 False(默认值) |
否 |
| logLevel | “Info”将记录所有复制的文件、跳过的文件和跳过的行。 “Warning”将仅记录跳过的文件和跳过的行。 | 信息 警告(默认) |
否 |
| 启用可靠日志记录 | 如果为 true,则在将每个文件复制到目标后,处于可靠模式的复制活动会立即刷新日志。 在Copy activity中启用可靠日志记录模式复制多个文件时,应该会期望吞吐量受到影响,因为复制的每个文件都需要双重写入操作。 一个请求是写入到目标存储,另一个请求是写入到日志存储。 处于最佳努力模式的复制活动将在一定时间内以批量记录的方式刷新日志,对复制吞吐量的影响要小得多。 在此模式下无法保证日志记录的完整性和时间线,因为在某些情况下,在Copy activity失败时,最后一批日志事件未刷新到日志文件中。 在这种情况下,你会看到复制到目标的一些文件未被记录。 | 为真 False(默认值) |
否 |
| logLocationSettings | 一组属性,可用于指定存储会话日志的位置。 | 否 | |
| linkedServiceName |
AzureBlobStorage 或 AzureBlobFS 类型链接服务的名称,指代用于存储日志文件的实例。 |
否 | |
| 路径 | 日志文件的路径。 | 指定用于存储日志文件的路径。 如果未提供路径,服务会为用户创建一个容器。 | 否 |
监控
复制活动的输出
copy activity完全运行后,可以看到每个Copy activity运行的输出中的日志文件的路径。 可以从以下路径中找到日志文件:https://[your-blob-account].blob.core.windows.net/[logFilePath]/copyactivity-logs/[copy-activity-name]/[copy-activity-run-id]/[auto-generated-GUID].txt。 生成的日志文件具有 .txt 扩展名,其数据采用 CSV 格式。
"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"
}
}
注意
当 enableCopyActivityLog 属性设置为 Enabled 时,日志文件名将由系统生成。
日志文件的架构
下表显示了日志文件的架构。
| 列 | 说明 |
|---|---|
| 时间戳 | ADF 读取、写入或跳过对象时的时间戳。 |
| 级别 | 此项的日志级别。 它可以是“警告”或“信息”。 |
| 操作名称 | 每个对象上的 ADF 复制活动操作行为。 它可以是“FileRead”、“FileWrite”、“FileSkip”或“TabularRowSkip”。 |
| 操作项 | 文件名或跳过的行。 |
| 消息 | 更多信息会显示文件是否从源存储中读取或写入到目标存储。 文件或行被跳过也可能是因为这个原因。 |
下面是日志文件的示例:
Timestamp, Level, OperationName, OperationItem, Message
2020-10-19 08:39:13.6688152,Info,FileRead,"sample1.csv","Start to read file: {""Path"":""sample1.csv"",""ItemType"":""File"",""Size"":104857620,""LastModified"":""2020-10-19T08:22:31Z"",""ETag"":""\""0x8D874081F80C01A\"""",""ContentMD5"":""dGKVP8BVIy6AoTtKnt+aYQ=="",""ObjectName"":null}"
2020-10-19 08:39: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=,'."
2020-10-19 08:40:13.6688152,Info,FileRead,"sample2.csv","Start to read file: {""Path"":""sample2.csv"",""ItemType"":""File"",""Size"":104857620,""LastModified"":""2020-10-19T08:22:31Z"",""ETag"":""\""0x8D874081F80C01A\"""",""ContentMD5"":""dGKVP8BVIy6AoTtKnt+aYQ=="",""ObjectName"":null}"
2020-10-19 08:40:13.9003981,Info,FileWrite,"sample2.csv","Start to write file from source file: sample2.csv."
2020-10-19 08:45:17.6508407,Info,FileRead,"sample2.csv","Complete reading file successfully. "
2020-10-19 08:45:28.7390083,Info,FileWrite,"sample2.csv","Complete writing file from source file: sample2.csv. File is successfully copied."
从上面的日志文件中,你可以看到 sample1.csv 已跳过,因为无法验证它在源存储和目标存储之间是否一致。 可以获取关于 sample1.csv 变得不一致的更多详细信息,这是因为在 ADF 复制活动进行的同时,其他应用程序也在更改该文件。 你还可以看到 sample2.csv 已成功地从源复制到目标存储。
你可以使用多个分析引擎进一步分析日志文件。 下面的几个示例使用 SQL 查询来分析日志文件,方法是将 csv 日志文件导入到 SQL 数据库,其中的表名称可以是 SessionLogDemo。
- 显示复制的文件列表。
select OperationItem from SessionLogDemo where Message like '%File is successfully copied%'
- 请给我特定时间范围内复制的文件列表。
select OperationItem from SessionLogDemo where TIMESTAMP >= '<start time>' and TIMESTAMP <= '<end time>' and Message like '%File is successfully copied%'
- 显示某个特定文件及其复制时间和元数据。
select * from SessionLogDemo where OperationItem='<file name>'
- 请提供在某个时间范围内复制的文件及其元数据的列表。
select * from SessionLogDemo where OperationName='FileRead' and Message like 'Start to read%' and OperationItem in (select OperationItem from SessionLogDemo where TIMESTAMP >= '<start time>' and TIMESTAMP <= '<end time>' and Message like '%File is successfully copied%')
- 显示跳过的文件列表。
select OperationItem from SessionLogDemo where OperationName='FileSkip'
- 告诉我为什么跳过了特定文件的原因。
select TIMESTAMP, OperationItem, Message from SessionLogDemo where OperationName='FileSkip'
- 显示由于“Blob 文件不存在”这一原因跳过的文件列表。
select TIMESTAMP, OperationItem, Message from SessionLogDemo where OperationName='FileSkip' and Message like '%UserErrorSourceBlobNotExist%'
- 给我复制时间最长的文件名。
select top 1 OperationItem, CopyDuration=DATEDIFF(SECOND, min(TIMESTAMP), max(TIMESTAMP)) from SessionLogDemo group by OperationItem order by CopyDuration desc
相关内容
请参阅其他关于复制活动的文章: