fsspec и вообще зачем оно нам нужно

63f78e31575ef475bf599013104f8468

Привет! Сегодня я расскажу вам про fsspec и его киллер фичи.

1. Введение

В современной разработке различного ПО и управлении данными, одной из ключевых проблем является работа с разнообразными файловыми системами. Разработчики и системные администраторы сталкиваются с вызовами при интеграции различных хранилищ данных, от локальных дисков до облачных сервисов. Эта множественность и разнообразие сильно усложняют процесс разработки и поддержки приложений, требуя от разработчиков постоянного адаптирования под различные стандарты и протоколы.

Унифицированный подход к управлению файлами является ключевым для повышения эффективности и гибкости разработки. Он позволяет разработчикам сосредоточиться на бизнес-логике приложений, минимизируя затраты времени и ресурсов на решение технических задач, связанных с файловыми системами. Кроме того, подобный подход облегчает масштабирование и интеграцию приложений в различные среды.

Несмотря на наличие различных инструментов и библиотек для работы с файловыми системами, многие из них ограничиваются поддержкой лишь определенных типов или не обеспечивают достаточной гибкости и расширяемости (boto3, pyhdfs и тд). Это ведет к необходимости использования множества различных инструментов, что усложняет процесс разработки и поддержки кода.

Неплохим решением данной проблемы, на мой взгляд, является fsspec или Filesystem Specification — библиотека Python, предоставляющая унифицированный интерфейс для работы с различными файловыми системами. fsspec абстрагирует операции с файлами, позволяя разработчикам использовать одинаковый код для доступа к файлам, независимо от их расположения и характеристик хранилища. Это значительно упрощает процесс интеграции и обслуживания приложений, работающих с данными. Также огромным плюсом является то, что синтаксис с самыми основными функциями fsspec знаком почти всем разработчикам. По сути она позволяет разработчикам взаимодействовать с файлами на локальных дисках, в облачных хранилищах и других удаленных источниках, используя единый стандартный код.

2. Установка и настройка

Для работы с определенными файловыми системами могут потребоваться дополнительные модули, например, s3fs для Amazon S3 или gcsfs для Google Cloud Storage. В данной статье мы посмотрим на пример с гугловых хранилищем.

Для начала работы с fsspec установите библиотеку через pip:

pip install fsspec
pip install fsspec[gcs]

Импортируем модуль:

import fsspec

3. Основы работы с fsspec

Объявляем файловую систему:

fs = fsspec.filesystem('gcs')

Перечисление файлов в каталоге

files = fs.ls('my-bucket/my-folder')

Копирование файла с s3 на s3

Можно так

fs.copy('gs://my-bucket/my-file.txt', 'gs://my-bucket/copy-of-my-file.txt')

А можно так

with fsspec.open('gs://my-bucket/my-file.txt', "rb") as src:
    with fsspec.open('gs://my-bucket/copy-of-my-file.txt', "wb") as out:
        out.write(src.read())

Удаление файла

fs.rm('gcs://my-bucket/unwanted-file.txt')

Чтение файла с локальной файловой системы

with fsspec.open('path/to/local/file.txt', 'r') as file:
    content = file.read()
    print(content)

Чтение файла с облачной файловой системы

with fsspec.open('gs://my-bucket/path/to/file.txt', 'r') as file:
    content = file.read()
    print(content)

Запись в файл на локальном диске

with fsspec.open('path/to/file.txt', 'w') as file:
    file.write('Hello, World!')

Запись в файл в облачном диске

with fsspec.open('gs://my-bucket/path/to/file.txt', 'w') as file:
    file.write('Hello, World!')

4. Киллер фичи

Чтение одного файла из zip/gzip архивов без предварительной разархивации. Ниже пример с чтением картинки

from PIL import Image
from io import BytesIO

# Путь к ZIP-архиву на S3
s3_path = 'gs:/my-bucket/file.zip'

# Путь к конкретному файлу внутри ZIP-архива
file_in_zip = '**folder/test.png'

# Полный путь для доступа к файлу внутри архива на S3
zip_image_path = f'zip://{file_in_zip}::{s3_path}'

with fsspec.open(zip_image_path, 'rb') as file:
    img_data = file.read()
    img_buffer = BytesIO(img_data)
    image = Image.open(img_buffer)
    image.show()

Также можно считывать сразу несколько файлов через шаблоны

# Путь к ZIP-архиву на S3
s3_path = 'gs:/my-bucket/file.zip'

# Путь к конкретному файлу внутри ZIP-архива
file_in_zip = '**folder/*.png'

# Полный путь для доступа к файлу внутри архива на S3
zip_images_path = f'zip://{file_in_zip}::{s3_path}'

files = fsspec.open_files(zip_images_path, "rb")

for file in files:
    img_data = file.open().read()
    img_buffer = BytesIO(img_data)
    image = Image.open(img_buffer)
    image.show()  

Кэширование файлов

# Открытие файла с механизмом кэширования 'readahead'
with fs.open('my-bucket/file.txt', mode='rb', cache_type='readahead') as f:
    data = f.read()

Этот список можно продолжать до бесконечности, так как функционал fsspec поистине широк. Например, в нём есть некоторая поддержка асинхронности, можно работать по ssh, есть поддержка уникальных файловых систем, таких как Google Cloud, и т.д. Со всеми этими и другими функциями можно ознакомиться тут.

5. Поговорим про минусы fsspec

  1. Не умеет генерировать подписанные урлы. Тоесть он не поддерживает автоматическое создание URL-адресов с включенными мерами безопасности, такими как подписи для временного доступа к защищенным ресурсам. В облачных хранилищах, таких как AWS S3, подписанные URL-адреса используются для предоставления ограниченного по времени доступа к файлам без необходимости предоставлять полные учетные данные.

  2. Ограниченная производительность с очень большими файлами. При работе с очень большими файлами (например, в несколько терабайт) fsspec может столкнуться с проблемами производительности. Это может быть связано с тем, что fsspec предназначен для обеспечения универсальности и удобства использования, а не для оптимизации работы с чрезвычайно большими объемами данных. В таких случаях может потребоваться использование более узкого решения, нацеленного на обработку больших файлов (например pyspark).

  3. Сложность настройки аутентификации для подключения. Настройка аутентификации в fsspec, особенно для подключения к защищенным файловым системам, может быть сложной. Это связано с тем, что разные системы хранения данных требуют различных методов аутентификации, и иногда настройка этих параметров в fsspec может потребовать дополнительных усилий.

6. Вывод

fsspec значительно упрощает и унифицирует процесс доступа к данным для разработчиков. Его гибкость и широкая поддержка различных хранилищ данных открывают новые возможности в разработке приложений, особенно в областях, где необходим быстрый и надежный доступ к данным из разнообразных источников.

© Habrahabr.ru