AWS Athena MSCK REPAIR TABLE 对于小型数据集来说花费的时间太长

AWS Athena MSCK REPAIR TABLE takes too long for a small dataset

我在使用 amazon athena 时遇到问题,我有一个小桶(36430 个对象,9.7 mb),有 4 个分区级别(my-bucket/p1=ab/p2=cd/p3=ef/p4=gh/file.csv ) 但是当我 运行 命令

MSCK REPAIR TABLE db.table

用了25多分钟,我打算把TB级的数据放到Athena上,如果这个问题仍然存在我就不做了

有人知道为什么花的时间太长了吗?

提前致谢

MSCK REPAIR TABLE 可能是一项代价高昂的操作,因为它需要扫描文件系统(S3 存储桶)中 table 的子树。多级分区会使它的成本更高,因为它需要遍历额外的子目录。假设分区值的所有潜在组合都出现在数据集中,这会变成组合爆炸。

如果您要将新分区添加到现有的 table,那么您可能会发现对各个新分区使用 运行 ALTER TABLE ADD PARTITION 命令更有效。这避免了扫描文件系统中 table 的整个子树的需要。它不如简单地 运行ning MSCK REPAIR TABLE 方便,但有时优化是值得的。一个可行的策略通常是使用 MSCK REPAIR TABLE 进行初始导入,然后使用 ALTER TABLE ADD PARTITION 进行持续维护,因为新数据被添加到 table.

如果用ALTER TABLE ADD PARTITION直接管理分区确实不可行,那么执行时间可能是不可避免的。减少分区数量可能会减少执行时间,因为它不需要遍历文件系统中的那么多目录。当然,然后分区不同,可能会影响查询执行时间,所以这是一个权衡。

虽然标记的答案在技术上是正确的,但它没有解决您的实际问题,即您的文件太多。

I have a small bucket ( 36430 objects , 9.7 mb ) with 4 levels of partition ( my-bucket/p1=ab/p2=cd/p3=ef/p4=gh/file.csv )

对于这么小的table,36430 个文件在 S3 上产生了巨大的开销,4 级分区是超级大材小用。分区阻碍了查询性能而不是优化它。 MSCK 很慢,因为它正在等待 S3 上市等等。

Athena 读取整个 9.7MB table 如果它在一个文件中比它能够列出那个巨大的目录结构更快。

我建议完全删除分区,或者如果您确实需要它们,则删除 p2、p3 和 p4 级别。还可以考虑将其处理成另一个 table 以将文件压缩成更大的文件。

有人建议最佳文件大小在 64MB 到 4GB 之间,这与 S3 上的本机块大小有关。拥有集群中 workers 的若干倍数的文件数量也很有帮助,尽管 Athena 不知道这一点。您的数据小于该范围,因此最多 1 个或 8 个文件是合适的。

一些参考资料: https://aws.amazon.com/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/#OptimizeFileSizes

https://www.upsolver.com/blog/small-file-problem-hdfs-s3

使用Athena Projection自动管理分区。