我有一个S3数据湖,我可以与雅典娜查询。同样的数据湖也与Amazon Redshift连接在一起。然而,当我在Redshift中运行查询时,与雅典娜相比,我的查询时间要长得多,即使是最简单的查询。
Athena中的查询CREATE TABLE x as (select p.anonymous_id, p.context_traits_email, p."_timestamp", p.user_id FROM foo.pages p)
- 运行时间:24.432秒
- 扫描数据:111.47 MB
查询Redshift
create temp table x as (
select p.anonymous_id, p.context_traits_email, p."_timestamp", p.user_id
FROM external_schema.pages p
)
查询需要17分钟才能运行!
Datalake,胶水
datalake有一个附加的胶水目录,由第三方工具(RudderStack)维护。没有爬虫,RudderStack将parquet文件放在S3桶的特定部分,并在模式发生更改时更新Glue目录,等等。
下面是Glue Table定义的相关部分:
- 位置:
s3://{bucketname}/rudder-datalake/{schemaname}/pages
- 输入格式:
org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat
- 输出格式:
org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat
- 服务器序列化库:
org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe
- 分区:没有
- 索引:没有
Redshift External Schema
外部模式是这样创建的:
create external schema if not exists external_schema
from data catalog
database 'foo'
region 'us-east-1'
iam_role 'arn:aws:iam::xxxxx';
查询运行时redshift集群上的cpu利用率(单个d2)。大节点)在整个查询运行时中不会超过15%。那么,如果不是红移超载的问题,那么在查询处理中怎么会有如此巨大的差异,特别是在查询中没有任何连接、区别等的情况下?
编辑
Redshift的SVL_S3QUERY_SUMMARY为这个查询只列出了一个条目:
- external_table_name:
S3 Scan {redshiftdb}_external_schema_pages
144067年 - 文件:
- 分裂:144067
- avg_request_parallelism: 10
你的文件太多了
S3访问的开销是问题所在。
请记住,每个切片最多有10个Spectrum工作者,但在实践中更少,并且您可能有一个更小的集群。您可能会同时访问10个文件,要读取144,000个文件,并且每个S3连接都会产生不可减少的延迟。
您正在物理地将整个表从athena复制到redshift,因此应该预期会花费很长的时间。这可能是由于网络流量瓶颈和缺乏优化(与COPY命令相比)
如果您只是想从s3加载一个表到redshift,那么您应该使用COPY。这将运行得更快。
当你需要下推谓词和连接到athena时,应该使用Redshift Spectrum,这可以提供良好的性能。
此外,似乎您的文件大小在s3中可能非常小。这大大降低了性能。您应该瞄准比当前文件大100倍的文件!