Как загрузить файл объемом 10 Гб с помощью токена SAS

#azure #azure-blob-storage

#azure #azure-blob-хранилище

Вопрос:

Я пытаюсь загрузить большой файл (более 10 ГБ) в хранилище больших двоичных объектов Azure с использованием токенов SAS. Я генерирую токены следующим образом

     val storageConnectionString = s"DefaultEndpointsProtocol=https;AccountName=${accountName};AccountKey=${accountKey}"
    val storageAccount = CloudStorageAccount.parse(storageConnectionString)
    val client = storageAccount.createCloudBlobClient()

    val container = client.getContainerReference(CONTAINER_NAME)
    val blockBlob = container.getBlockBlobReference(path)
    val policy = new SharedAccessAccountPolicy()
    policy.setPermissionsFromString("racwdlup")
    val date = new Date().getTime();
    val expiryDate = new Date(date   8640000).getTime()
    policy.setSharedAccessStartTime(new Date(date))
    policy.setSharedAccessExpiryTime(new Date(expiryDate))
    policy.setResourceTypeFromString("sco")
    policy.setServiceFromString("bfqt")
    val token = storageAccount.generateSharedAccessSignature(policy)
  

Затем я попробовал API-интерфейс Put Blob и обнаружил следующую ошибку

 $ curl -X PUT -H 'Content-Type: multipart/form-data' -H 'x-ms-date: 2020-09-04' -H 'x-ms-blob-type: BlockBlob' -F file=@10gb.csv  https://ACCOUNT.blob.core.windows.net/CONTAINER/10gb.csv?ss=bfqtamp;sig=.... -v

< HTTP/1.1 413 The request body is too large and exceeds the maximum permissible limit.
< Content-Length: 290
< Content-Type: application/xml
< Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
< x-ms-request-id: f08a1473-301e-006a-4423-837a27000000
< x-ms-version: 2019-02-02
< x-ms-error-code: RequestBodyTooLarge
< Date: Sat, 05 Sep 2020 01:24:35 GMT
* HTTP error before end of send, stop sending
< 
<?xml version="1.0" encoding="utf-8"?><Error><Code>RequestBodyTooLarge</Code><Message>The request body is too large and exceeds the maximum permissible limit.
RequestId:f08a1473-301e-006a-4423-837a27000000
* Closing connection 0
* TLSv1.2 (OUT), TLS alert, close notify (256):
Time:2020-09-05T01:24:35.7712576Z</Message><MaxLimit>268435456</MaxLimit></Error>%      
  

После этого попытался загрузить его с помощью PageBlob (я видел в документации что-то вроде размера, который может составлять до 8 ТИБ)

 $ curl -X PUT -H 'Content-Type: multipart/form-data' -H 'x-ms-date: 2020-09-04' -H 'x-ms-blob-type: PageBlob' -H 'x-ms-blob-content-length: 1099511627776' -F file=@10gb.csv  https://ACCOUNT.blob.core.windows.net/CONTAINER/10gb.csv?ss=bfqtamp;sig=... -v

< HTTP/1.1 400 The value for one of the HTTP headers is not in the correct format.
< Content-Length: 331
< Content-Type: application/xml
< Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
< x-ms-request-id: b00d5c32-101e-0052-3125-83dee7000000
< x-ms-version: 2019-02-02
< x-ms-error-code: InvalidHeaderValue
< Date: Sat, 05 Sep 2020 01:42:24 GMT
* HTTP error before end of send, stop sending
< 
<?xml version="1.0" encoding="utf-8"?><Error><Code>InvalidHeaderValue</Code><Message>The value for one of the HTTP headers is not in the correct format.
RequestId:b00d5c32-101e-0052-3125-83dee7000000
* Closing connection 0
* TLSv1.2 (OUT), TLS alert, close notify (256):
Time:2020-09-05T01:42:24.5137237Z</Message><HeaderName>Content-Length</HeaderName><HeaderValue>10114368132</HeaderValue></Error>%   
  

Не уверен, как правильно загружать такой большой файл?

Ответ №1:

Проверьте различные типы больших двоичных объектов здесь: https://learn.microsoft.com/en-us/rest/api/storageservices/understanding-block-blobs—append-blobs—and-page-blobs

Большой двоичный объект страницы фактически ограничивает максимальный размер до 8 ТБ, но он оптимален для операций случайного чтения и записи.

С другой стороны:

Блочные двоичные объекты оптимизированы для эффективной загрузки больших объемов данных. Большие двоичные объекты состоят из блоков, каждый из которых идентифицируется идентификатором блока. Большой двоичный объект может содержать до 50 000 блоков.

Таким образом, block blobs — это правильный путь, поскольку он поддерживает размеры до 190,7 ТБ (режим предварительного просмотра)

Теперь вам нужно использовать блок put https://learn.microsoft.com/en-us/rest/api/storageservices/put-block чтобы загрузить блоки, которые будут формировать ваш большой двоичный объект.

Комментарии:

1. Я использую блок Put, но, как я описал выше, он не позволяет мне писать, см. Ошибку выше The request body is too large and exceeds the maximum permissible limit. , и именно поэтому я ищу обходной путь.

2. Вы должны разбить файл на блоки и предоставить идентификаторы блоков для нескольких операций ввода. red-gate.com/simple-talk/cloud/platform-as-a-service/… здесь показано, как это сделать программно

3. да, я думаю, что это правильный путь, спасибо, что поделились

Ответ №2:

Для копирования больших файлов в большой двоичный объект вы можете использовать azcopy:

Сначала аутентифицируйтесь:

 azcopy login
  

Затем скопируйте файл:

 azcopy copy 'C:myDirectorymyTextFile.txt' 'https://mystorageaccount.blob.core.windows.net/mycontainer/myTextFile.txt'
  

https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-blobs?toc=/azure/storage/blobs/toc.json