azcopy не выполняет копирование блоба, размер которого меньше 1000 КБ.

Вопрос или проблема

Лог из azcopy:

 2024/10/21 06:47:13 ==> ЗАПРОС/ОТВЕТ (Попытка=1/69.6505ms, ВремяОперации=69.771031ms) -- ОТВЕТ УСПЕШНО ПОЛУЧЕН 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 Статус: 409 Тип блоба недействителен для этой операции. Content-Length: 228 Content-Type: application/xml Дата: Пн, 21 октября 2024 06:47:13 GMT Сервер: Windows-Azure-Blob/1.0
 Microsoft-HTTPAPI/2.0 X-Ms-Client-Request-Id: -Ms-Error-Code: InvalidBlobType X-Ms-Request-Id: -Ms-Version: 2023-08-03
2024/10/21 06:47:13 ОШИБКА: [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 Тип блоба недействителен для этой операции.. При загрузке блоба из URL. X-Ms-Request-Id: d7601b94-801e-0030-4b85-23a96b000000

Моя задача – преобразовать append blob в block blob.
Предположим, у меня есть append blob с именем : publicstatistics_16.jsonl

Шаг 1) Сначала я использую AZcopy для копирования append blob, а в целевой папке я создам его как bb-publicstatistics_16.jsonl

Шаг 2) Затем я снова использую azcopy для копирования block blob, который является bb-publicstatistics_16.jsonl, в publicstatistics_16.jsonl.

Это прекрасно работает с помощью azcopy, когда размер блоба превышает 1000kb.
Любой блоб, размер которого меньше 1000kb, выдает указанную выше ошибку, которую я отправил.

На каком этапе происходит сбой?
Сбой происходит на шаге 2.
Все, что я пытаюсь сделать, это скопировать block blob с именем bb-publicstatistics_16.jsonl в publicstatistics_16.jsonl в том же контейнере.

Я даже пытался вручную загрузить блоб и загрузить его с другим именем для всех блобов, размер которых меньше 1000kb, та же ошибка “тип блоба недействителен”, и я также использовал код, но ошибка осталась прежней.

def upload_small_block_blob(self, blob_service_client, container, blob_name):# Загрузить маленький блоб с помощью 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:
            # Проверить, существует ли блоб
            if blob_client.exists():
                log.error(f"Блоб '{blob_name}' уже существует. Выберите другое имя.")
                return
            # Загрузить данные как новый Block Blob
            blob_client.upload_blob(data)
            log.info(f"Новый Block Blob '{blob_name}' успешно загружен.")
        except Exception as e:
            log.error(f"Не удалось загрузить новый Block Blob '{blob_name}': {str(e)}")

Даже в этом случае также возникает ошибка “тип блоба недействителен.
Нет понятия, что произошло.

Примечание: Эта проблема возникает только в том случае, если размер блоба меньше 1000kb, и нет никаких проблем, если размер блоба больше 1000kb до 100Gib (это максимальное преобразование блоба, которое я делал до сих пор для одного файла).

На каком этапе происходит сбой? ** Сбой происходит на шаге 2. ** Все, что я пытаюсь сделать, это скопировать block blob с именем bb-publicstatistics_16.jsonl в publicstatistics_16.jsonl в том же контейнере.

В моем окружении я хранил файл меньше 1000kb с тем же именем publicstatistics_16.jsonl (Append blob) в Azure Blob storage.

Портал:
введите описание изображения сюда

Вы можете использовать приведенный ниже код, который загружает append блоб и загружает блоб как block блоб с помощью Python.

Код:

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"Блоб '{new_blob_name}' уже существует. Выберите другое имя.")
            return
        new_blob_client.upload_blob(downloaded_data, blob_type="BlockBlob")
        print(f"Новый Block Blob '{new_blob_name}' успешно загружен.")
    except Exception as e:
        print(f"Не удалось загрузить новый Block Blob '{new_blob_name}': {str(e)}")

# Пример использования
connection_string = "xxxx"
container_name = "xxx"
blob_name = "publicstatistics_16.jsonl"  # Оригинальный append blob
new_blob_name = "bb-publicstatistics_16.jsonl"  # Новый block blob

upload_small_block_blob(connection_string, container_name, blob_name, new_blob_name)

Вывод:

Новый Block Blob 'bb-publicstatistics_16.jsonl' успешно загружен.

Портал:
введите описание изображения сюда

Ответ или решение

Описание проблемы с AzCopy и решением для копирования блобов

Общая информация

Вы столкнулись с проблемой, когда AzCopy не удается скопировать блоб размера менее 1000 КБ, и получаете сообщение об ошибке "Тип блоба недопустим для этой операции". Это может произойти по нескольким причинам, и в данной статье мы подробно рассмотрим этапы, на которых происходит сбой, а также предложим возможные решения.

Структура проблемы

  1. Этапы операции:

    • Шаг 1: Копирование блоба-аппенда publicstatistics_16.jsonl с использованием AzCopy и создание нового блоба bb-publicstatistics_16.jsonl.
    • Шаг 2: Копирование нового блоба bb-publicstatistics_16.jsonl обратно в publicstatistics_16.jsonl.
  2. Ошибка:

    • Ваша ошибка возникает на шаге 2, когда вы пытаетесь скопировать блоб bb-publicstatistics_16.jsonl обратно как publicstatistics_16.jsonl.
  3. Логи:

    • Приведенные вами логи показывают, что ошибка возникает из-за недопустимого типа блоба, что часто случается при попытке скопировать блоб, который изначально был создан с другим типом (в вашем случае – блоб-аппенда) и не был корректно преобразован.

Возможные причины ошибки

  1. Тип блоба:

    • Azure поддерживает несколько типов блобов, включая блобы-аппенды и блобы типа "Block". При попытке скопировать блоб, сделанный как блоб-аппенд, в другой тип блоба (в вашем случае – блоб типа "Block"), может возникнуть такая ошибка.
  2. Размер блоба:

    • Вы отметили, что проблема возникает только для блобов размером менее 1000 КБ. Для блобов этого размера Azure иногда накладывает дополнительные ограничения, которые могут влиять на операции копирования.

Шаги по устранению проблемы

1. Проверьте тип блоба

Удостоверьтесь, что целевой блоб (bb-publicstatistics_16.jsonl) был создан с правильным типом блоба. Если он был создан как блоб-аппенд, преобразование может потребовать дополнительных манипуляций.

2. Используйте SDK Azure для конвертации

Поскольку вы уже испытываете трудности с AzCopy, попробуйте использовать SDK Azure для программного уменьшения размера.

Пример функции, которая может помочь в этом процессе:

from azure.storage.blob import BlobServiceClient

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}' уже существует. Выберите другое имя.")
            return

        new_blob_client.upload_blob(downloaded_data, blob_type="BlockBlob")
        print(f"Успешно загружен новый блоб `{new_blob_name}` как Block Blob.")
    except Exception as e:
        print(f"Ошибка при загрузке нового блоба `{new_blob_name}`: {str(e)}")

# Пример использования
connection_string = "ваша_строка_соединения"
container_name = "ваш_контейнер"
blob_name = "publicstatistics_16.jsonl"  # Блоб-аппенд
new_blob_name = "bb-publicstatistics_16.jsonl"  # Новый блоб типа Block

upload_small_block_blob(connection_string, container_name, blob_name, new_blob_name)
3. Альтернативный подход

Если обработка с помощью AzCopy и SDK не дает желаемых результатов, вы можете рассмотреть возможность выполнения операции через Azure Portal, скачав и повторно загрузив файл, либо воспользовавшись сторонними инструментами.

Заключение

Проблема с копированием блобов меньшего размера может возникать из-за неправильного типа блоба, несовместимого с операцией, которую вы пытаетесь выполнить. Используйте вышеописанные методы для обработки и устранения проблемы, и помните, что работа с меньшими блобами может иногда накладывать ограничения, к которым следует обращать внимание.

Если данные рекомендации не помогут, рекомендуем обратиться в службу поддержки Azure для получения дальнейшей помощи.

Оцените материал
Добавить комментарий

Капча загружается...