【发布时间】:2020-04-16 16:39:01
【问题描述】:
最近,当分区数量非常多时,我在使用 AWS Athena 时遇到了问题。
旧版本的数据库和表只有 1 个分区级别,比如 id=x。我们来一张桌子;例如,我们存储每个 id(产品)的支付参数,并且没有足够的 ID。假设它在1000-5000左右。现在,在查询该表时,在 where 子句(如“.. where id = 10”)上传递 id 号。实际上,查询的返回速度非常快。假设我们每天更新两次数据。
最近,我们一直在考虑为一天添加另一个分区级别,例如“../id=x/dt=yyyy-mm-dd/..”。这意味着如果一个月过去了,分区数每天会增加 xID 次,如果我们有 3000 个 ID,我们每月大约会获得 3000x30=90000 个分区。因此,分区数量迅速增长。
假设 3 个月大的数据(约 27 万个分区),我们希望看到类似以下的查询最多会在 20 秒左右返回。
select count(*) from db.table where id = x and dt = 'yyyy-mm-dd'
这需要一分钟。
真实案例
事实证明,Athena 首先获取所有分区(元数据)和 s3 路径(不管 where 子句的用法),然后过滤您希望在 where 条件下查看的那些 s3 路径。第一部分(按分区获取所有 s3 路径的持续时间与分区数量成正比)
您拥有的分区越多,执行的查询就越慢。
直观地说,我预计 Athena 只获取 where 子句中声明的 s3 路径,我的意思是这将是分区的一种神奇方式。也许它会获取所有路径
- 是否有人知道解决方法,或者我们是否以错误的方式使用 Athena?
- 是否应仅将 Athena 用于少量分区?
编辑
为了澄清上面的陈述,我从支持邮件中添加了一条。
来自支持
... 您提到您的新系统有 360000,这是一个巨大的数字。 所以当你在做
select * from <partitioned table>时,Athena 首先下载所有分区元数据并搜索映射的 S3 路径 那些分区。这个为每个分区获取数据的过程 导致查询执行时间更长。 ...
更新
在 AWS 论坛上打开了一个问题。在 aws 论坛上提出的链接问题是 here。
谢谢。
【问题讨论】:
-
您是否已经考虑过分桶?
-
@PiotrFindeisen 你的意思是分桶天而不是分区天?我没有尝试过,但它会加速where子句吗?如果您打算获得最佳文件数,您可以假设我们在每个分区中都有最佳文件数
-
我不知道你的查询模式(这是关键部分,真的)。直觉上,我会先尝试按
dt进行分区,然后按id进行分桶。但是,我不知道您为什么按id进行分区以及id实际上是什么。此外,没有最佳文件数之类的东西。如果您使用 ORC 或 Parquet,您只需关心文件至少为 32-64MB,但单个文件可能会很大。 -
顺便说一句,正如您所见,这不是一个非常适合的简单问题,并且没有单一的答案。我建议您通过Presto community slack 咨询 Presto 专家。
-
@null :这可能对您的用例很有帮助:aws.amazon.com/premiumsupport/knowledge-center/…
标签: amazon-web-services nosql aws-glue presto amazon-athena