如何为 BlobContainerClient 设置 dfs insted blob 端点
Posted
技术标签:
【中文标题】如何为 BlobContainerClient 设置 dfs insted blob 端点【英文标题】:how setup dfs insted blob endpoint for BlobContainerClient 【发布时间】:2021-12-10 16:00:59 【问题描述】:一般来说,我需要使用 java 创建一个应用程序,该应用程序将在 azure storage 上执行一些操作 比如上传文件,附加到文件,重命名,检查是否存在等等。重要的是它必须与 DFS 端点 https://xxxx.dfs.core.windows 进行通信..
但是我遇到了一些问题:
-
在使用 BlobContainerClient 并将文件上传到 Azure 存储期间出现错误:
com.azure.storage.blob.models.BlobStorageException:状态码 400, ""error":"code":"MissingRequiredHeader","message":"一个 HTTP 标头 对于此请求,这是强制性的 指定。\nRequestId:b225d695-201f-00ed-212e-c7c9e8000000\nTime:2021-10-22T10:23:12.4983407Z""
如何避免这种情况,需要什么标头以及如何设置?
之后我实现了类似的东西,但使用 DataLakeFileSystemClient,这次上传文件完全没问题。不幸的是,并非所有操作都可以执行。例如exists() 方法内部使用 BlobContainerClient 并通过 blob 端点 https://xxxx.blob.core.windows 执行调用。如果在我的情况下被禁止怎么办。 IMO 这是因为 BlobContainerClientBuilder.endpoint(String endpoint) 设置了端点 blobContainerClient 端点到 blob,以及 DataLakeFileSystemClient 的 dfs 端点。 源代码:
public DataLakeFileSystemClientBuilder endpoint(String endpoint) // 确保提供的端点是 dfs 端点 endpoint = DataLakeImplUtils.endpointToDesiredEndpoint(endpoint, "dfs", "blob"); blobContainerClientBuilder.endpoint(DataLakeImplUtils.endpointToDesiredEndpoint(endpoint, "blob", "dfs"));
所以问题是:它是 BlobContainerClientBuilder.endpoint(String endpoint) 中的错误吗? 或如何解决此问题以对两个客户端使用相同的端点。 目前,我已经实现了 wcomunicatend 我正在使用两个客户端:DataLakeFileSystemClient 来执行操作 像上传,追加等和 BlobContainerClient 来检查文件是否存在。我只想使用其中一个客户端。
你能帮我吗?
【问题讨论】:
【参考方案1】:Azure Blob 存储是为存储大量非结构化数据而开发的。并且非结构化数据不遵循特定的数据模型或定义,例如文本或二进制数据。
Blob Storage 提供三种资源,分别是 Storage Account (SA)、Container inside SA 和 Blob in the Container。我们使用一些 Java 类来与这些资源进行交互。
BlobContainerClient 类允许您操作 Azure 存储容器及其 Blob。该类主要用于操作或处理Containers(文件系统)。因此,如果您希望处理或操作 Blob(文件),建议使用 BlobClient。
检查以下sn-ps创建容器并上传文件。
使用BlobContainerClient
创建一个容器。
blobContainerClient.create();
使用从BlobContainerClient
生成的BlobClient
将BinaryData
上传到blob。
BlobClient blobClient = blobContainerClient.getBlobClient("myblockblob");
String dataSample = "samples";
blobClient.upload(BinaryData.fromString(dataSample));
要重命名 blob(文件),复制和删除是重命名 blob 的唯一方法。如果您想对较大的 blob 执行此操作,则需要使用异步副本并定期检查其是否完成。
查看此Manage blobs with Java v12 SDK 和Azure Storage Blob client library for Java 文档了解更多信息。
【讨论】:
以上是关于如何为 BlobContainerClient 设置 dfs insted blob 端点的主要内容,如果未能解决你的问题,请参考以下文章