为啥 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 写入容器。我不知道。 再看日志,我认为 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 数据工厂中永远停留在排队状态?

是否可以使用 ARM 模板重新部署 Azure 数据工厂

是否可以使用 Azure Synapse 和 Azure 数据工厂将 CSV 转换为 XML?

如何使用 Azure 数据工厂使用私有终结点访问 Azure Function?

使用 azure 数据工厂管道将 json 对象存储到 azure 表存储实体

如何使用 azure 数据工厂拆分列值