azcopy 无法复制大小小于 1000kb 的 blob

问题描述 投票:0回答:1

从 azcopy 登录:

 2024/10/21 06:47:13 ==> REQUEST/RESPONSE (Try=1/69.6505ms, OpTime=69.771031ms) -- RESPONSE SUCCESSFULLY RECEIVED PUT https://storage-account.blob.core.windows.net/container/2024/filepath/bb-GOPACS-0.jsonl?si=rlwc&sig=-REDACTED-&sr=c&sv=2024-08-04 
Accept: application/xml Content-Length: 0 User-Agent: AzCopy/10.26.0 azsdk-go-azblob/v1.4.0 (go1.22.5; linux) X-Ms-Client-Request-Id: 
 x-ms-access-tier: Hot x-ms-blob-content-md5: x-ms-blob-content-type: application/jsonl;charset=UTF-8 
x-ms-blob-type: BlockBlob x-ms-copy-source: https://storage-account.blob.core.windows.net/container/2024/filepath/bb-GOPACS-0.jsonl?sas-token
 2023-08-03 Status: 409 The blob type is invalid for this operation.Content-Length: 228Content-Type: application/xmlDate: Mon, 21 Oct 2024 06:47:13 GMTServer: Windows-Azure-Blob/1.0
 Microsoft-HTTPAPI/2.0X-Ms-Client-Request-Id: -Ms-Error-Code: InvalidBlobTypeX-Ms-Request-Id: -Ms-Version: 2023-08-03
2024/10/21 06:47:13 ERR: [P#0-T#0] COPYFAILED: https://storage-account.blob.core.windows.net/container/2024/filepath/bb-GOPACS-0.jsonl?si=rlwc&sig=-REDACTED-&sr=c&sv=2024-08-04/bb-GOPACS-0.jsonl : 409 : 409 The blob type is invalid for this operation.. When Put Blob from URL. X-Ms-Request-Id: d7601b94-801e-0030-4b85-23a96b000000

我的要求是将附加 blob 转换为块 blob。 考虑我有一个名为:publicstatistics_16.jsonl

的追加 blob

步骤 1)首先,我使用 AZcopy 复制追加 blob,并在目标中将其创建为 bb-publicstatistics_16.jsonl

步骤2)然后我再次使用azcopy将块blob(bb-publicstatistics_16.jsonl)复制到publicstatistics_16.jsonl。

当 blob 大小大于 1000kb 时,使用 azcopy 可以完美地工作。 任何大小小于 1000 kb 的 blob 都会显示我发送的上述错误。

在什么阶段失败? 第2步失败。 我想做的就是将名称为 bb-publicstatistics_16.jsonl 的块 blob 复制到同一容器中的 publicstatistics_16.jsonl 。

我什至尝试手动下载 blob 并为所有大小小于 1000kb 的 blob 使用不同的名称上传它,同样的错误“blob 类型无效”,我也使用了代码,但仍然出现相同的错误。

def upload_small_block_blob(self, blob_service_client, container, blob_name):# Download the small blob using the SDK
   new_blob_client = container_client.get_blob_client(new_block_blob_name)
   downloaded_data = new_blob_client.download_blob().readall()
   blob_client = blob_service_client.get_blob_client(container=container, blob=blob_name)

        try:
            # Check if the blob already exists
            if blob_client.exists():
                log.error(f"Blob '{blob_name}' already exists. Choose a different name.")
                return
            # Upload the data as a new Block Blob
            blob_client.upload_blob(data)
            log.info(f"Uploaded new Block Blob '{blob_name}' successfully.")
        except Exception as e:
            log.error(f"Failed to upload new Block Blob '{blob_name}': {str(e)}")

即使在这种情况下,它也显示错误 blob 类型无效。 不知道发生了什么。

注意:仅当 Blob 大小小于 1000kb 时才会出现此问题,如果 Blob 大小大于 1000kb 到 100Gib 则没有问题(这是我迄今为止为一个文件完成的最大 Blob 转换)。

python azure-blob-storage blob azcopy blobstorage
1个回答
0
投票

在哪个阶段失败?** 在第2步失败。 **我想做的就是将名称为 bb-publicstatistics_16.jsonl 的块 blob 复制到同一个容器中的 publicstatistics_16.jsonl 。

在我的环境中,我在 Azure Blob 存储中存储了一个小于 1000kb 的同名文件

publicstatistics_16.jsonl
(追加 blob)。

传送门: enter image description here

您可以使用以下代码下载

append
blob 并使用 Python 将 blob 上传为
block
blob 类型。

代码:

from azure.storage.blob import BlobServiceClient, BlobClient

def upload_small_block_blob(connection_string, container_name, blob_name, new_blob_name):
    try:

        blob_service_client = BlobServiceClient.from_connection_string(connection_string)
        container_client = blob_service_client.get_container_client(container_name)
        old_blob_client = container_client.get_blob_client(blob_name)
    
        downloaded_data = old_blob_client.download_blob().readall()
        new_blob_client = container_client.get_blob_client(new_blob_name)
        if new_blob_client.exists():
            print(f"Blob '{new_blob_name}' already exists. Choose a different name.")
            return
        new_blob_client.upload_blob(downloaded_data, blob_type="BlockBlob")
        print(f"Uploaded new Block Blob '{new_blob_name}' successfully.")
    except Exception as e:
        print(f"Failed to upload new Block Blob '{new_blob_name}': {str(e)}")

# Example usage
connection_string = "xxxx"
container_name = "xxx"
blob_name = "publicstatistics_16.jsonl"  # Original append blob
new_blob_name = "bb-publicstatistics_16.jsonl"  # New block blob

upload_small_block_blob(connection_string, container_name, blob_name, new_blob_name)

输出:

Uploaded new Block Blob 'bb-publicstatistics_16.jsonl' successfully.

传送门: enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.