Redshift Spectrum 如何扫描数据?

Vzz*_*arr 5 amazon-s3 amazon-web-services amazon-redshift amazon-redshift-spectrum aws-glue-data-catalog

给定 S3 上由时间戳字段分区的 1.4 TB Parquet 数据的数据源(因此分区为year- month- day),我正在查询特定日期的数据(2.6 GB 数据)并通过 Redshift 检索 Parquet 文件中的所有可用字段此查询的频谱:

SELECT *
FROM my_external_schema.my_external_table
WHERE year = '2020' and month = '01' and day = '01'
Run Code Online (Sandbox Code Playgroud)

该表可通过Glue Crawler访问,该 Glue Crawler 指向 S3 中的顶层“文件夹”;这将创建一个数据库,然后通过此命令将数据库链接到新的外部架构

create external schema my_external_schema from data catalog
database 'my_external_schema'
iam_role 'arn:aws:iam::123456789:role/my_role'
region 'my-region-9';
Run Code Online (Sandbox Code Playgroud)

在我的 IDE 中分析该表,我可以看到该表是由以下语句生成的:

create external table my_external_schema.my_external_table
    (
    id string,
    my_value string,
    my_nice_value string
    )
partitioned by (year string, month string, day string)
row format serde 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
with serdeproperties ('serialization.format'='1')
stored as
inputformat 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
outputformat 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
location 's3://my-bucket/my/location/'
table properties ('CrawlerSchemaDeserializerVersion'='1.0', 'CrawlerSchemaSerializerVersion'='1.0', 'UPDATED_BY_CRAWLER'='my_crawler');
Run Code Online (Sandbox Code Playgroud)

当我分析 Redshift 的查询时,我发现它扫描了约 86 GB 的数据。

这怎么可能?这是一个问题,因为 Redshift 根据扫描的数据量进行计费,并且该服务扫描的数据量大约是该分区中实际数据量的 40 倍。

我还尝试在 Athena 中执行相同的查询,但只扫描了 2.55 GB 的数据(绝对更合理)。

我无法提供有关集群大小的太多详细信息,但假设这些 86GB 的扫描数据适合集群的内存。

Hyr*_*a92 5

问题似乎出在 AWS Redshift 控制台中。

如果我们从 Redshift 控制台中的“查询详细信息”分析查询,我可以看到“扫描的总数据”报告为 86GB。正如 Vzarr 提到的,我在 Athena 上运行相同的查询来比较性能。执行时间基本相同,但扫描的数据量完全不同:2.55GB。

我与 S3 外部架构上的其他查询(使用和不使用分区列)进行了相同的比较:我发现每次测试中扫描的 GB 总数都不同,有时差异很大(Redshift Spectrum 中为 320MB,Athena 中为 20GB)。

我决定查看 Redshift 中的系统表,以了解外部架构上的查询是如何工作的。我使用SVL_S3QUERY做了一个非常简单的测试:

SELECT (cast(s3_scanned_bytes as double precision) / 1024 / 1024 / 1024) as gb_scanned,
       s3_scanned_rows,
       query
FROM SVL_S3QUERY
WHERE query = '<my-query-id>'
Run Code Online (Sandbox Code Playgroud)

对于同一查询,结果与 AWS Redshift Console 的结果完全不同。不但gb_scanned错了,而且s3_scanned_rows也错了。查询总共返回了2.55GB的Scanned数据,和Athena说的一模一样。

为了确认 SVL_S3QUERY 中的数字,我使用AWS Cost Explorer仔细检查了一天扫描的 GB 总量以及我们为 Redshift Spectrum 支付的费用:数字基本相同。

此时,我不知道 AWS Redshift 控制台从何处或哪个表获取查询详细信息,但它们似乎完全错误。

  • 我可以确认这是一个“已知错误”,将由 Amazon Redshift 开发团队解决。感谢您提供深入的细节! (3认同)