Redshift Spectrum 性能对比 Athena

Posted

技术标签:

【中文标题】Redshift Spectrum 性能对比 Athena【英文标题】:Redshift Spectrum Performance vs Athena 【发布时间】:2019-09-03 09:18:42 【问题描述】:

我在 S3 中有一个存储桶,其中包含镶木地板文件并按日期分区。

使用以下查询:

select
    count(1)
from logs.logs_prod
where partition_1 = '2019' and partition_2 = '03'

直接在 Athena 中运行该查询,不到 10 秒即可执行。但是当我在 Redshift 中运行相同的查询时,它需要 3 多分钟。它们都返回相同的正确值,在这种情况下,该分区中的行数少于 8 万。

我使用 AWS Glue 作为 Athena 和 Redshift 的元数据存储。

Redshift 的查询计划如下:

QUERY PLAN
XN Limit  (cost=250000037.51..250000037.51 rows=1 width=8)
  ->  XN Aggregate  (cost=250000037.51..250000037.51 rows=1 width=8)
        ->  XN Partition Loop  (cost=250000000.00..250000035.00 rows=1000 width=8)
              ->  XN Seq Scan PartitionInfo of logs.logs_prod  (cost=0.00..15.00 rows=1 width=0)
                    Filter: (((partition_1)::text = '2019'::text) AND ((partition_2)::text = '03'::text))
              ->  XN S3 Query Scan logs_prod  (cost=125000000.00..125000010.00 rows=1000 width=8)
                    ->  S3 Aggregate  (cost=125000000.00..125000000.00 rows=1000 width=0)
                          ->  S3 Seq Scan logs.logs_prod location:"s3://logs-prod/" format:PARQUET  (cost=0.00..100000000.00 rows=10000000000 width=0)

此问题是 Redshift Spectrum 配置问题吗? Redshift 中的查询是否可能无法在 Athena 附近执行?

【问题讨论】:

我遇到了类似的问题。我对外部表进行了一个非常简单的查询,其中镶木地板文件由 varchar 和日期分区。我用一个 parquet 文件编写了一个针对单个分区的查询,它需要一分钟多的时间才能返回。我不想回答问题,所以我为格式化道歉...查询:SELECT uuid FROM spectrum.telemetry_event WHERE "tag" = 'my.test.tag' AND date = '2020-05-06'; 查询计划:XN Partition Loop \n -> XN Seq Scan \n Filter \n -> XN S3 Query Scan \n -> S3 Seq Scan 好读:blog.panoply.io/… 【参考方案1】:

我认为你不应该对这个测试过于重视。从计划来看,它似乎没有利用 Parquet 文件包含有关每个文件中的行数的元数据这一事实——我相信 Athena/Parquet 可以做到这一点。

Athena 与 Redshift Spectrum 的实际实际性能很难衡量,因为使用 Athena,您不知道自己获得了多少容量(但数量很多),而在 Redshift Spectrum 中,您获得的专用容量取决于你的集群大小。对于具有约 20 个 CPU 的 Redshift 集群,我发现 Athena 对大多数查询的性能更好,但更大的 Redshift 集群可能会获得更好的性能。

【讨论】:

这不是一个测试,而是一个真实的问题。我同时使用 Athena 和 Redshift 进行报告,但使用 S3 的 Redshift 效果不佳。 如果您给我们提供更多关于 Redshift 速度慢的示例,也许我们可以为您提供更多帮助。如果您所做的只是计算分区中的行数,那么看起来 Athena 将是更好的选择,但在我看来这不太可能是您唯一要做的事情。 我只是想通过 Redshift 从 S3 中提取一些数据。我想使用这些数据加入 Redshift 中的其他表。简单的选择或仅此计数效果不佳。这样一来,我就必须从 Athena 中提取数据并插入 Redshift 来执行这个简单的查询。 在上面的评论中添加了一个类似的查询,但我肯定看到我自己的双分区表的性能一直很差。针对单个分区以读取单个 parquet 文件的简单查询需要 1:20s 到 3m 之间的任何时间。 一件奇怪的事情:当我查询 svl_s3query_summary 时,它说 elapsed 时间是 1.851s,但运行时间是 1m 36s...

以上是关于Redshift Spectrum 性能对比 Athena的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Psycopg2 在 Redshift Spectrum 中添加分区 -

Redshift Spectrum 使用两个日期字段对表进行分区

如何更改 Redshift Spectrum 中的外部表?

查询字符串列的 Redshift Spectrum 数组

Redshift Spectrum 和 Hive Metastore - 模棱两可的错误

Redshift Spectrum 比 Athena 慢很多?