Лучшая практика для эффективного и правильного извлечения большого ZIP с Azure Databricks + DataLake - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь извлечь zip-файл, размер которого составляет 28 Мб, в «свою» подпапку. Исходный ZIP-файл содержит дополнительные 365 ZIP-файлов. Каждый из них составляет около 80 КБ и содержит 1 XML файл, который я тоже должен извлечь. Общий расширенный размер составляет 2 ГБ (XML очень хорошо сжат).

Эта операция основана на Azure Учетная запись хранилища (Data Lake Store gen.2 с иерархическим пространством имен), которую я смонтировал из Databricks с Python, поэтому начальный файл доступен как 'dbfs: /mnt/datalake/gme/mgp/20190301_20200228MBOfferteFree_Pubbliche.zip'. Затем я разработал эту простую функцию, которая просто извлекает из этого 365 заархивированных файлов: zip:

from zipfile import ZipFile
def unzip(f): 
  zipFile='/dbfs%s' % f[5:] # '/dbfs/mnt/datalake/gme/mgp/20190301_20200228MBOfferteFree_Pubbliche.zip'
  zipFolder=zipFile[:-4] # '/dbfs/mnt/datalake/gme/mgp/20190301_20200228MBOfferteFree_Pubbliche'
  ZipFile(zipFile).extractall(zipFolder)

unzip('dbfs:/mnt/datalake/gme/mgp/20190301_20200228MBOfferteFree_Pubbliche.zip')

Конечно, я разработал и остальные, но проблема в том, что даже на первом шаге есть 2 большие проблемы:

  1. ЧРЕЗВЫЧАЙНО медленно. Иногда это занимает одну минуту, иногда 8 минут, а иногда и больше (хотя на моей простой записной книжке это занимает 10 секунд!)
  2. не удается, вполне всегда. Я уверен, что исходный файл в ADLS НЕ поврежден, на самом деле я могу загрузить и развернуть его локально, но с помощью этой процедуры получается, что через некоторое время один случайный файл извлекается с размером 0 байт, генерируя ошибку и останавливая выполнение.

Мне интересно, может ли это зависеть от библиотеки zipfile, или конфигурации Databricks (в настоящее время 2-4 узла Standard DS3-V2), или настроек DataLake (теперь LRS).

Любые предложения, действительно ценятся. Спасибо,

Мауро

...