Поделиться через


Работа с файлами в Azure Databricks

Azure Databricks имеет несколько служебных программ и API для взаимодействия с файлами в следующих расположениях:

  • Тома каталога Unity
  • Файлы рабочей области
  • Облачное хранилище объектов
  • Подключения DBFS и корневой каталог DBFS
  • Эфемерное хранилище, подключенное к узлу драйвера кластера

В этой статье приведены примеры взаимодействия с файлами в этих расположениях для следующих средств:

  • Apache Spark
  • Spark SQL и Databricks SQL
  • Служебные программы файловой системы Databricks (dbutils.fs или %fs)
  • Интерфейс командной строки Databricks
  • Databricks REST API
  • Команды оболочки Bash (%sh)
  • Установка библиотеки с областью действия записной книжки с помощью %pip
  • Панды
  • Программы управления файлами и обработки OSS Python

Важный

Некоторые операции в Databricks, особенно с помощью библиотек Java или Scala, выполняются как процессы JVM, например:

  • Указание зависимости от JAR-файла с использованием --jars в конфигурациях Spark
  • Вызов cat или java.io.File в ноутбуках Scala
  • Пользовательские источники данных, такие как spark.read.format("com.mycompany.datasource")
  • Библиотеки, загружающие файлы с помощью Java FileInputStream или Paths.get()

Эти операции не поддерживают чтение или запись в тома каталога Unity или файлы рабочей области с использованием стандартных путей к файлам, например /Volumes/my-catalog/my-schema/my-volume/my-file.csv. Если вам нужно получить доступ к файлам томов или файлам рабочей области из JAR-зависимостей или библиотек на основе JVM, скопируйте файлы сначала на локальное хранилище с помощью команд Python или %sh, таких как %sh mv.. Не используйте %fs и dbutils.fs, которые используют JVM. Чтобы получить доступ к файлам, уже скопированным локально, используйте команды, такие как Python shutil или %sh. Если файл должен присутствовать во время запуска кластера, используйте скрипт инициализации для первого перемещения файла. См. Что такое скрипты инициализации?.

Нужно ли предоставить схему URI для доступа к данным?

Пути доступа к данным в Azure Databricks соответствуют одному из следующих стандартов:

  • пути в стиле URI включают схему URI. Для решений доступа к данным на основе Databricks схемы URI являются необязательными для большинства вариантов использования. При непосредственном доступе к данным в облачном хранилище объектов необходимо предоставить правильную схему URI для типа хранилища.

    схема путей URI

  • Пути, соответствующие POSIX-стандарту, предоставляют доступ к данным относительно корневого каталога драйвера (/). Пути в стиле POSIX никогда не требуют схемы. Вы можете использовать тома каталога Unity или подключения DBFS для предоставления доступа к данным в облачном хранилище объектов в стиле POSIX. Многие платформы машинного обучения и другие модули Python OSS требуют FUSE и могут использовать только пути в стиле POSIX.

    схема путей POSIX

Заметка

Операции с файлами, требующие доступа к данным FUSE, не могут напрямую получить доступ к облачному хранилищу объектов с помощью URI. Databricks рекомендует использовать тома Unity Catalog для конфигурирования доступа к этим расположениям для FUSE.

При вычислении, настроенном с выделенным режимом доступа (ранее однопользовательским режимом доступа) и Databricks Runtime 14.3 и выше, Scala поддерживает FUSE для томов каталога Unity и файлов рабочей области, за исключением подпроцессов, запускаемых из Scala, таких как команда Scala "cat /Volumes/path/to/file".!!.

Работа с файлами в томах каталога Unity

Databricks рекомендует использовать тома каталога Unity для настройки доступа к файлам не табличных данных, хранящимся в облачном хранилище объектов. См. Что такое томы каталога Unity?.

Инструмент Пример
Apache Spark spark.read.format("json").load("/Volumes/my_catalog/my_schema/my_volume/data.json").show()
Spark SQL и Databricks SQL SELECT * FROM csv.`/Volumes/my_catalog/my_schema/my_volume/data.csv`;
LIST '/Volumes/my_catalog/my_schema/my_volume/';
Служебные программы файловой системы Databricks dbutils.fs.ls("/Volumes/my_catalog/my_schema/my_volume/")
%fs ls /Volumes/my_catalog/my_schema/my_volume/
Интерфейс командной строки Databricks databricks fs cp /path/to/local/file dbfs:/Volumes/my_catalog/my_schema/my_volume/
Databricks REST API POST https://<databricks-instance>/api/2.1/jobs/create
{"name": "A multitask job", "tasks": [{..."libraries": [{"jar": "/Volumes/dev/environment/libraries/logging/Logging.jar"}],},...]}
Команды оболочки Bash %sh curl http://<address>/text.zip -o /Volumes/my_catalog/my_schema/my_volume/tmp/text.zip
Установка библиотеки %pip install /Volumes/my_catalog/my_schema/my_volume/my_library.whl
Панды df = pd.read_csv('/Volumes/my_catalog/my_schema/my_volume/data.csv')
ПО с открытым исходным кодом Python os.listdir('/Volumes/my_catalog/my_schema/my_volume/path/to/directory')

Заметка

При работе с интерфейсом командной строки Databricks требуется схема dbfs:/.

Ограничения томов

Объёмы имеют следующие ограничения:

  • Операции, такие как прямое добавление или непоследовательные (случайные) записи, например, с файлами ZIP и Excel, не поддерживаются. Для рабочих нагрузок прямого добавления или случайной записи сначала выполните операции на локальном диске, а затем скопируйте результаты в тома каталога Unity. Например:

    # python
    import xlsxwriter
    from shutil import copyfile
    
    workbook = xlsxwriter.Workbook('/local_disk0/tmp/excel.xlsx')
    worksheet = workbook.add_worksheet()
    worksheet.write(0, 0, "Key")
    worksheet.write(0, 1, "Value")
    workbook.close()
    
    copyfile('/local_disk0/tmp/excel.xlsx', '/Volumes/my_catalog/my_schema/my_volume/excel.xlsx')
    
  • Разреженные файлы не поддерживаются. Чтобы скопировать разреженные файлы, используйте cp --sparse=never:

    $ cp sparse.file /Volumes/my_catalog/my_schema/my_volume/sparse.file
    error writing '/dbfs/sparse.file': Operation not supported
    $ cp --sparse=never sparse.file /Volumes/my_catalog/my_schema/my_volume/sparse.file
    

Работа с файлами рабочей области

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

Инструмент Пример
Apache Spark spark.read.format("json").load("file:/Workspace/Users/<user-folder>/data.json").show()
Spark SQL и Databricks SQL SELECT * FROM json.`file:/Workspace/Users/<user-folder>/file.json`;
Служебные программы файловой системы Databricks dbutils.fs.ls("file:/Workspace/Users/<user-folder>/")
%fs ls file:/Workspace/Users/<user-folder>/
Интерфейс командной строки Databricks databricks workspace list
Databricks REST API POST https://<databricks-instance>/api/2.0/workspace/delete
{"path": "/Workspace/Shared/code.py", "recursive": "false"}
Команды оболочки Bash %sh curl http://<address>/text.zip -o /Workspace/Users/<user-folder>/text.zip
Установка библиотеки %pip install /Workspace/Users/<user-folder>/my_library.whl
Панды df = pd.read_csv('/Workspace/Users/<user-folder>/data.csv')
ПО с открытым исходным кодом Python os.listdir('/Workspace/Users/<user-folder>/path/to/directory')

Заметка

Схема file:/ требуется при работе с служебными программами Databricks, Apache Spark или SQL.

Ограничения при работе с файлами рабочей области см. в Ограничениях.

Куда идут удаленные файлы рабочей области?

Удаление файла в рабочей области отправляет его в корзину. Вы можете восстановить или окончательно удалить файлы из корзины с помощью пользовательского интерфейса.

См. Удалить объект.

Работа с файлами в облачном хранилище объектов

Databricks рекомендует использовать тома каталога Unity для настройки безопасного доступа к файлам в облачном хранилище объектов. Необходимо настроить разрешения, если вы решили напрямую получить доступ к данным в облачном хранилище объектов с помощью URI. См. раздел Управление внешними расположениями, внешними таблицами и внешними томами.

В следующих примерах используются URI для доступа к данным в облачном хранилище объектов:

Инструмент Пример
Apache Spark spark.read.format("json").load("abfss://[email protected]/path/file.json").show()
Spark SQL и Databricks SQL SELECT * FROM csv.`abfss://[email protected]/path/file.json`; LIST 'abfss://[email protected]/path';
Служебные программы файловой системы Databricks dbutils.fs.ls("abfss://[email protected]/path/") %fs ls abfss://[email protected]/path/
Интерфейс командной строки Databricks Не поддерживается
Databricks REST API Не поддерживается
Команды оболочки Bash Не поддерживается
Установка библиотеки %pip install abfss://[email protected]/path/to/library.whl
Панды Не поддерживается
ПО с открытым исходным кодом Python Не поддерживается

Работа с файлами в маунтах DBFS и корневом каталоге DBFS

Подключения DBFS не могут быть защищены с помощью каталога Unity и больше не рекомендуются компанией Databricks. Данные, хранящиеся в корневом каталоге DBFS, доступны всем пользователям в рабочей области. Databricks рекомендует не хранить конфиденциальный или продукционный код или данные в корневом каталоге DBFS. См. Что такое DBFS?.

Инструмент Пример
Apache Spark spark.read.format("json").load("/mnt/path/to/data.json").show()
Spark SQL и Databricks SQL SELECT * FROM json.`/mnt/path/to/data.json`;
Служебные программы файловой системы Databricks dbutils.fs.ls("/mnt/path")
%fs ls /mnt/path
Интерфейс командной строки Databricks databricks fs cp dbfs:/mnt/path/to/remote/file /path/to/local/file
Databricks REST API POST https://<host>/api/2.0/dbfs/delete --data '{ "path": "/tmp/HelloWorld.txt" }'
Команды оболочки Bash %sh curl http://<address>/text.zip > /dbfs/mnt/tmp/text.zip
Установка библиотеки %pip install /dbfs/mnt/path/to/my_library.whl
Панды df = pd.read_csv('/dbfs/mnt/path/to/data.csv')
ПО с открытым исходным кодом Python os.listdir('/dbfs/mnt/path/to/directory')

Заметка

При работе с интерфейсом командной строки Databricks требуется схема dbfs:/.

Работа с файлами в эфемерном хранилище, подключенном к узлу драйвера

Эфемерное хранилище, подключенное к узлу драйвера, — это блочное хранилище с встроенным доступом к файловым путям на основе POSIX. Все данные, хранящиеся в этом расположении, исчезают при завершении или перезапуске кластера.

Инструмент Пример
Apache Spark Не поддерживается
Spark SQL и Databricks SQL Не поддерживается
Служебные программы файловой системы Databricks dbutils.fs.ls("file:/path")
%fs ls file:/path
Интерфейс командной строки Databricks Не поддерживается
Databricks REST API Не поддерживается
Команды оболочки Bash %sh curl http://<address>/text.zip > /tmp/text.zip
Установка библиотеки Не поддерживается
Панды df = pd.read_csv('/path/to/data.csv')
ПО с открытым исходным кодом Python os.listdir('/path/to/directory')

Заметка

Схема file:/ требуется при работе с служебными программами Databricks.

Перемещение данных из эфемерного хранилища в тома

Возможно, вам потребуется получить доступ к данным, скачанным или сохраненным в эфемерное хранилище с помощью Apache Spark. Так как эфемерное хранилище подключено к драйверу, а Spark — это распределённая система обработки данных, не все операции могут напрямую обращаться к данным здесь. Предположим, что необходимо переместить данные из файловой системы драйвера в тома каталога Unity. В этом случае можно скопировать файлы с помощью магических команд или служебных программ Databricks, как показано в следующих примерах:

dbutils.fs.cp ("file:/<path>", "/Volumes/<catalog>/<schema>/<volume>/<path>")
%sh cp /<path> /Volumes/<catalog>/<schema>/<volume>/<path>
%fs cp file:/<path> /Volumes/<catalog>/<schema>/<volume>/<path>

Дополнительные ресурсы

Сведения о загрузке локальных файлов или скачивании файлов из интернета в Azure Databricks см. в загрузка файлов в Azure Databricks.