Назад | Перейти на главную страницу

Файловая система на основе S3, способная запрашивать только часть файла

Я храню большие наборы данных в s3, но на данном компьютере в моем кластере моей программе нужно читать только небольшое подмножество данных.

Сначала я попробовал s3fs, но сначала он загружает весь файл, что занимает очень много времени.

Существуют ли какие-либо файловые системы с поддержкой s3, которые используют S3 API байты параметр, чтобы внутренние команды чтения (и поиска) читали только желаемую часть файла?

В качестве практического примера, если я бегу:

хвост -c 1024 огромный_файл_он_s3

следует запрашивать только последний 1 КБ (через параметр bytes), то есть я должен получить результат очень быстро.

(Меня не интересует обратная запись в S3; только чтение с него)

Вы можете использовать диапазон HTTP для получения диапазона байтов из файла S3, это документированный способ достижения этого в Документация по S3 API. Библиотека, которая может помочь, - это бото, написанный на питоне. С помощью boto вы можете делать что-то вроде:

tempfile = open(tempFilePath, 'wb')
S3Key.get_contents_to_file(tempfile, headers={'Range': 'bytes=0-100000'}

видеть https://stackoverflow.com/questions/16788290/boto-get-byte-range-returns-more-than-expected

Если вы можете заменить файловую систему программой на Python или аналогичной, она будет работать лучше всего. S3 не предназначен для использования в качестве файловой системы, и такие инструменты, как s3fs, не одобряются. Некоторое время я использовал s3fs в производстве, и это всегда доставляло больше хлопот, чем пользы. Это хорошо для некритичных частей, но не совместимо с posix. Кроме того, я не могу представить, что вы найдете инструмент, который предоставляет HTTP API S3.

Однако, изучая недавние проблемы с s3fs, я обнаружил, что если вы отключите кеш (параметр use_cache), то s3fs не будет загружать весь файл. Проблема: https://code.google.com/p/s3fs/source/detail?r=458 В последний s3fs похоже, что по умолчанию use_cache отключен.

Я предполагаю, что большинство серверов будут поддерживать заголовки HTTP Range. 'bytes' звучит так, как будто это внутренняя функция S3, в то время как заголовки Range поддерживаются всеми современными веб-серверами, о которых я знаю.