基于 S3 的文件系统,能够仅请求文件的一部分

基于 S3 的文件系统,能够仅请求文件的一部分

我将大型数据集存储在 s3 中,但在我的集群中的给定计算机上,我的程序只需要读取一小部分数据。

我首先尝试了 s3fs,但它首先下载整个文件,这需要很长时间。

是否有任何使用 S3 API 的 S3 支持文件系统字节参数,以便内部读取(和查找)命令仅读取文件的所需部分?

作为一个实际的例子,如果我运行:

tail -c 1024 s3 上的 huge_file

只需要请求最后 1kb(通过字节参数),这意味着我应该非常快地得到结果。

(我不关心写回 S3;只关心从中读取)

答案1

您可以使用 HTTP Range 从 S3 文件中获取字节范围,这是在S3 API 文档可以提供帮助的图书馆是博托,用 Python 编写。使用 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 标准。此外,我无法想象您会找到一个公开 S3 的 HTTP API 的工具。

然而,在研究最近的 s3fs 问题时,我发现如果关闭缓存(use_cache 选项),s3fs 将不会下载整个文件。问题:https://code.google.com/p/s3fs/source/detail?r=458最新的 s3fs似乎默认情况下 use_cache 已关闭。

答案2

我认为大多数服务器都会支持 HTTP Range 标头。'bytes' 听起来像是 S3 独有的内部功能,而据我所知,每个现代 Web 服务器都支持 Range 标头。

相关内容