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 的扫描数据适合集群的内存。
问题似乎出在 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 控制台从何处或哪个表获取查询详细信息,但它们似乎完全错误。
| 归档时间: |
|
| 查看次数: |
1390 次 |
| 最近记录: |