AWS Athena 的分区数据导致 S3 中有很多小文件

Partition data for AWS Athena results in a lot of small files in S3

我有一个大型数据集 (>40G),我想将其存储在 S3 中,然后使用 Athena 进行查询。

根据 this blog post 的建议,我可以将我的数据存储在以下分层目录结构中,以便在从我的数据集创建 table 时使用 MSCK REPAIR 自动添加分区。

s3://yourBucket/pathToTable/<PARTITION_COLUMN_NAME>=<VALUE>/<PARTITION_COLUMN_NAME>=<VALUE>/

但是,这需要我将我的数据集拆分成许多较小的数据文件,每个文件都将存储在一个嵌套的文件夹下,具体取决于分区键。

虽然使用分区可以减少 Athena 扫描的数据量,从而加快查询速度,但是管理大量小文件是否会导致 S3 出现性能问题?这里有我需要考虑的权衡吗?

我将尝试进入它而不会过多地进入意见领域。

对于我使用 Athena 的用例,按照底层技术 (Presto) 旨在处理的标准,40 GB 实际上是一个非常小的数据集。根据 Presto 网页,Facebook 使用底层技术查询其 300 PB 数据仓库。我经常在 500 GB 到 1 TB 的数据集上使用它。

考虑到底层的 S3 技术,S3 用于托管 Dropbox 和 Netflix,因此我怀疑大多数企业是否能够对存储基础设施征税。您可能听说过性能问题,S3 与网站在分散在 S3 中的许多文件中存储多个小的静态内容片段有关。在这种情况下,延迟检索这些小内容之一可能会影响较大站点上的用户体验。

相关阅读: Presto

是的,您可能会遇到小文件和大量分区的效率显着下降。

Here对文件大小和分区数量有很好的解释和建议,应该大于128 MB以补偿开销。

此外,我在一个非常小的数据集 (1 GB) 中进行了一些实验,按分钟、小时和天对数据进行分区。分区越小扫描的数据越少,但是查询的时间会增加很多(有的实验慢了40倍)。