Как заархивировать файлы (на Azure Blob Storage) с помощью shutil в Databricks - PullRequest
0 голосов
/ 13 января 2020

Моя обученная модель глубокого обучения существует из пары файлов в папке. Так что это не имеет никакого отношения к архивированию данных.

Я хочу сжать эту папку (в Azure хранилище BLOB-объектов). Но когда я делаю с shutil, это, кажется, не работает:

import shutil
modelPath = "/dbfs/mnt/databricks/Models/predictBaseTerm/noNormalizationCode/2020-01-10-13-43/9_0.8147903598547376"
zipPath= "/mnt/databricks/Deploy/" (no /dbfs here or it will error)
shutil.make_archive(base_dir= modelPath, format='zip', base_name=zipPath)

Кто-нибудь знает, как это сделать и получить файл в хранилище BLOB-объектов Azure (откуда я его прочитал)?

Ответы [ 2 ]

1 голос
/ 13 января 2020

В конце концов, я понял это сам.

Невозможно напрямую записать в dbfs (Azure Хранилище BLOB-объектов) с помощью Shutil.

Сначала необходимо поместить файл на локальный узел драйвера блоков данных, например, так (прочитайте его где-нибудь в документации, которую нельзя напрямую записать в хранилище BLOB-объектов):

import shutil
modelPath = "/dbfs/mnt/databricks/Models/predictBaseTerm/noNormalizationCode/2020-01-10-13-43/9_0.8147903598547376"
zipPath= "/tmp/model"
shutil.make_archive(base_dir= modelPath, format='zip', base_name=zipPath)

, а затем Вы можете скопировать файл с локального узла драйвера в хранилище BLOB-объектов. Обратите внимание на «file:», чтобы получить файл из локального хранилища!

blobStoragePath = "dbfs:/mnt/databricks/Models"
dbutils.fs.cp("file:" +zipPath + ".zip", blobStoragePath)

Я потерял пару часов с этим, пожалуйста, проголосуйте, если вам помог этот ответ!

0 голосов
/ 14 января 2020

На самом деле, без использования shutil, я могу сжать файлы в Databricks dbfs в zip-файл в виде большого двоичного объекта Azure Blob Storage, который был смонтирован в dbfs.

Вот мой пример кода с использованием Python стандартных библиотек os и zipfile.

# Mount a container of Azure Blob Storage to dbfs
storage_account_name='<your storage account name>'
storage_account_access_key='<your storage account key>'
container_name = '<your container name>'

dbutils.fs.mount(
  source = "wasbs://"+container_name+"@"+storage_account_name+".blob.core.windows.net",
  mount_point = "/mnt/<a mount directory name under /mnt, such as `test`>",
  extra_configs = {"fs.azure.account.key."+storage_account_name+".blob.core.windows.net":storage_account_access_key})

# List all files which need to be compressed
import os
modelPath  = '/dbfs/mnt/databricks/Models/predictBaseTerm/noNormalizationCode/2020-01-10-13-43/9_0.8147903598547376'
filenames = [os.path.join(root, name) for root, dirs, files in os.walk(top=modelPath , topdown=False) for name in files]
# print(filenames)

# Directly zip files to Azure Blob Storage as a blob
# zipPath is the absoluted path of the compressed file on the mount point, such as `/dbfs/mnt/test/demo.zip`
zipPath = '/dbfs/mnt/<a mount directory name under /mnt, such as `test`>/demo.zip'
import zipfile
with zipfile.ZipFile(zipPath, 'w') as myzip:
  for filename in filenames:
#    print(filename)
    myzip.write(filename)

Я попытался смонтировать свой контейнер test в dbfs и запустить мой пример кода, затем я получил * Файл 1013 *, который содержит все файлы в моем test контейнере, как показано на рисунке ниже.

enter image description here

...