为啥 Azure 数据工厂使用 AppendFile 而不是 PutBlob 将文件写入 Blob 存储容器?
Posted
技术标签:
【中文标题】为啥 Azure 数据工厂使用 AppendFile 而不是 PutBlob 将文件写入 Blob 存储容器?【英文标题】:Why does Azure Data Factory use AppendFile instead of PutBlob to write files to blob storage container?为什么 Azure 数据工厂使用 AppendFile 而不是 PutBlob 将文件写入 Blob 存储容器? 【发布时间】:2021-07-30 04:15:52 【问题描述】:我已经建立了一个 Log Analytics 工作区,并为一些 Azure 存储帐户创建了一些 (blob) 诊断设置。现在我正在分析 blob 流量。
似乎将 blob 放入 blob 存储的各种方法(Azure 数据工厂 (ADF)、Azure 存储资源管理器 (ASE)、Python SDK 等)使用不同的开箱即用 API 方法。
示例:
我看到所有使用 ADF 上传的文件都使用AppendFile
OperationName
而所有使用 ASE 上传的文件都使用 PutBlob
OperationName
问题:
AppendFile
是在 ADF 端明确设置的方法吗?
还是将 Blob 从 ADF 写入 Blob 存储时的默认设置?
另外,我没有看到 AppendFile
在 Blob Service REST API docs 中列为方法。
【问题讨论】:
您在 ADF 中使用了哪个活动? 它是一个不同的团队,它使用 ADF 写入容器。我不知道。 再看日志,我认为 ADF 正在使用AzureDataFactoryCopy
。在StorageBlobLogs
表中,我看到了UserAgentHeader: AzureDataFactoryCopy
。这就是你要找的东西吗?
【参考方案1】:
我可以重现您的问题,我想您的存储帐户是Data Lake Storage Gen2 account,即Hierarchical namespace
已启用,如下所示。
当您在 ADF 中使用 copy activity 在容器(在 datalake gen2 中也称为文件系统)之间复制 blob 时,它将调用 Data Lake Storage Gen2 REST API 而不是普通的 Storage REST API - Path - Update,如果您查看日志中的Uri
参数,你会发现它的格式如下。
它与 REST API 示例相同,因为它本质上调用了此 API。
即使是 Data Lake Storage Gen2 帐户,普通的 Storage REST API 也适用,所以如果你使用 Azure Storage Explorer 之类的东西,它本质上是直接调用普通的 Storage REST API 即Put blob
。
【讨论】:
每个系统使用的不同 REST API(ADF、ASE、Python SDK 和 Flow 等)对 EventGrid 函数触发器和 LogAnalytics 造成了一些挑战。 我不太明白为什么 ADF 会使用“追加”操作来创建新文件。对此有一些直觉会很好。您知道为什么 ADF 复制操作会执行此 PATCH 而不是 PUT? @ericOnline 和linked service相关,你同事使用Azure Data Lake Storage Gen2
链接服务,所以调用了ADLS Gen2 REST API。
@ericOnline 如果他使用Azure Blob storage 链接服务,那么它将调用正常的Azure 存储REST API,即Put 。 (即使存储帐户是 ADLS Gen2 帐户,也可以使用普通的 azure storage REST API)。【参考方案2】:
如果您使用的是 Azure 数据工厂流程,并且主 id 相同,它通常会执行 AppendFile 操作
【讨论】:
对。这篇文章问“为什么?”。以上是关于为啥 Azure 数据工厂使用 AppendFile 而不是 PutBlob 将文件写入 Blob 存储容器?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用 Azure Synapse 和 Azure 数据工厂将 CSV 转换为 XML?
如何使用 Azure 数据工厂使用私有终结点访问 Azure Function?