我正在尝试使用 Azure 数据工厂管道中的复制数据活动将 Azure 表存储表备份到 Azure Blob 存储。
这大部分工作正常,但对于我的一些存储帐户,某些具有大量记录的表始终失败。管道中的错误消息是“客户端无法在指定超时内完成操作。”
我在阅读 Azure 表存储时将问题归结为间歇性峰值;备份过程中的大多数请求需要不到 250 毫秒才能完成,但有时有些请求需要约 19000 毫秒才能完成。当 Azure 表存储出现这些读取峰值时,Blob 上传会超时。这些峰值持续发生,以至于我永远无法完成这些表的备份。
有没有办法在写入 blob 存储时增加接收器超时,或者是否有其他配置可以用来帮助这些上传成功?
这是管道运行中的错误示例:
{
"dataRead": 2073796386,
"dataWritten": 211593105,
"filesWritten": 12,
"sourcePeakConnections": 1,
"sinkPeakConnections": 1,
"rowsRead": 1272000,
"rowsCopied": 1272000,
"copyDuration": 372,
"throughput": 7302.1,
"logFilePath": "backup-logs/copyactivity-logs/Copy to Blob Storage/163560cd-ec4b-4fba-86f2-c6a5ea8ce584/",
"errors": [
{
"Code": 9011,
"Message": "ErrorCode=UserErrorFailedFileOperation,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=The file operation is failed, upload file failed at path: 'backups/20230908/activities/activities_00012.parquet'.,Source=Microsoft.DataTransfer.Common,''Type=Microsoft.WindowsAzure.Storage.StorageException,Message=The client could not finish the operation within specified timeout.,Source=Microsoft.WindowsAzure.Storage,''Type=System.TimeoutException,Message=The client could not finish the operation within specified timeout.,Source=,'",
"EventType": 0,
"Category": 5,
"Data": {},
"MsgId": null,
"ExceptionType": null,
"Source": null,
"StackTrace": null,
"InnerEventInfos": []
}
],
"effectiveIntegrationRuntime": "PrivateNetworkIntegrationRuntime (North Central US)",
"usedDataIntegrationUnits": 4,
"billingReference": {
"activityType": "DataMovement",
"billableDuration": [
{
"meterType": "ManagedVNetIR",
"duration": 0.4666666666666667,
"unit": "DIUHours"
}
]
},
"usedParallelCopies": 1,
"executionDetails": [
{
"source": {
"type": "AzureTableStorage"
},
"sink": {
"type": "AzureBlobStorage"
},
"status": "Failed",
"start": "9/8/2023, 10:21:57 AM",
"duration": 372,
"usedDataIntegrationUnits": 4,
"usedParallelCopies": 1,
"profile": {
"queue": {
"status": "Completed",
"duration": 87
},
"transfer": {
"status": "Completed",
"duration": 284,
"details": {
"readingFromSource": {
"type": "AzureTableStorage",
"workingDuration": 274,
"timeToFirstByte": 0
},
"writingToSink": {
"type": "AzureBlobStorage",
"workingDuration": 4
}
}
}
},
"detailedDurations": {
"queuingDuration": 87,
"timeToFirstByte": 0,
"transferDuration": 284
}
}
],
"dataConsistencyVerification": {
"VerificationResult": "NotVerified"
},
"durationInQueue": {
"integrationRuntimeQueue": 0
}
}
复制数据活动的“常规”超时配置已设置为 12 小时,因此这不是一个因素。如果复制活动运行完成,则需要不到一个小时(基于具有相同表且不存在此问题的其他存储帐户)。
我尝试了一些方法来尝试让管道成功:我单独运行了单个表的备份,以确保它不是负载问题,但这些也失败了。我还调整了“最大数据集成单位”和“复制并行度”以尝试减慢复制过程(再次减少负载),但这也没有影响。
AFAIK,默认情况下,将数据写入接收器的超时时间是 2 小时。我们无法增加它。
对于较大的表(即卷为 100 GB 或更大或无法在两小时内迁移到 Azure 的表),我们建议您对数据进行分区
要解决这种情况,您可以尝试以下选项来分区数据。
在每个文件中写入特定的行集
在此之后使用另一复制活动尝试将文件合并为一个,以便将所有数据复制到一个文件中。