Вопрос или проблема
Лог из 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: Копирование блоба-аппенда
publicstatistics_16.jsonl
с использованием AzCopy и создание нового блобаbb-publicstatistics_16.jsonl
. - Шаг 2: Копирование нового блоба
bb-publicstatistics_16.jsonl
обратно вpublicstatistics_16.jsonl
.
- Шаг 1: Копирование блоба-аппенда
-
Ошибка:
- Ваша ошибка возникает на шаге 2, когда вы пытаетесь скопировать блоб
bb-publicstatistics_16.jsonl
обратно какpublicstatistics_16.jsonl
.
- Ваша ошибка возникает на шаге 2, когда вы пытаетесь скопировать блоб
-
Логи:
- Приведенные вами логи показывают, что ошибка возникает из-за недопустимого типа блоба, что часто случается при попытке скопировать блоб, который изначально был создан с другим типом (в вашем случае – блоб-аппенда) и не был корректно преобразован.
Возможные причины ошибки
-
Тип блоба:
- Azure поддерживает несколько типов блобов, включая блобы-аппенды и блобы типа "Block". При попытке скопировать блоб, сделанный как блоб-аппенд, в другой тип блоба (в вашем случае – блоб типа "Block"), может возникнуть такая ошибка.
-
Размер блоба:
- Вы отметили, что проблема возникает только для блобов размером менее 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 для получения дальнейшей помощи.