案例中心

  • 首页
  • 案例中心
  • 评估使用 Redshift Test Drive 和高级 SQL 分析的 Amazon Redshi

评估使用 Redshift Test Drive 和高级 SQL 分析的 Amazon Redshi

2026-01-27 14:46:10

评估亚马逊 Redshift 数据共享架构

关键要点

本文探讨了通过 Amazon Redshift 数据共享架构及其 Test Drive 工具来优化数据仓库配置。使用 Workload Replicator 工具重放工作负载,以分析 ETL 和 BI 工作负载的性能表现。结果显示,通过数据共享,实现了 ETL 和 BI 工作负载的显著性能改进。

随着 Amazon Redshift Serverless 及其多种 预配置实例部署选项 的推出,用户亟需工具来确定最优的数据仓库配置,以支持其 Amazon Redshift 工作负载。

魔方加速器

Amazon Redshift 是一款广泛使用的、完全托管的、支持 PB 级数据量的数据仓库服务。成千上万的客户每天使用 Amazon Redshift 处理外部数据以驱动其分析工作负载。

Redshift Test Drive 是一个托管在 GitHub 上的工具,帮助客户评估哪种数据仓库配置选项最适合其工作负载。Test Drive 包含的 工作负载复制器 工具,包括一些脚本,用于从源仓库的审计日志中提取工作负载查询,并在启动的目标仓库上重放这些查询。Test Drive 的 配置比较工具 通过结合使用 AWS CloudFormation 和 AWS Step Functions 来自动化这一过程,能够部署目标 Amazon Redshift 仓库并协调源工作负载的重放。

这两种工具从重放源工作负载的目标配置中卸载性能指标到 Amazon 简单存储服务 (Amazon S3),该服务用作存储性能指标的存储位置。尽管 重放分析 UI 和配置比较工具可以提供初步性能比较,许多客户希望通过自身分析原始数据来深入挖掘。

本文演示了一个示例工作负载在单个 Amazon Redshift 数据仓库及数据共享架构中的重放,输出结果将用于评估工作负载的性能。

使用案例概述

在示例用例中,我们假设目前存在一个2个 ra34xlarge 的预配置数据仓库,正运行 ETL、临时性和商业智能 (BI) 查询。我们希望通过数据共享将这些工作负载拆分为一个运行 ETL 的 32 基准 RPU 无服务器生产者,和一个运行 BI 工作负载的 64 基准 RPU 无服务器消费者。我们使用工作负载复制器在指定的教程中对源和目标数据共享配置的副本基线进行工作负载重放。以下图像显示了流程。

生成与访问 Test Drive 指标

Amazon Redshift Test Drive 的结果可以通过外部模式来访问,以便分析重播。请参考 工作负载复制器自述文件 和 配置比较自述文件,以获取使用相应工具执行重放的详细说明。

外部模式将在使用配置比较工具时自动创建,这种情况下可以直接进行 SQL 分析。而如果使用工作负载复制器,外部模式不会自动创建,因此在 SQL 分析之前需要手动配置。接下来,我们将演示如何设置外部模式,并使用数据共享的示例进行分析。

执行 Test Drive 工作负载复制器以进行数据共享

要执行工作负载复制器,请使用 Amazon 弹性计算云 (Amazon EC2) 运行用于提取源工作负载的自动化脚本。

配置 Amazon Redshift 数据仓库

创建快照,按照 Amazon Redshift 管理指南的指导进行。根据 Amazon Redshift 管理指南启用 审计日志记录。按照 Amazon Redshift 管理指南启用源集群的 用户活动日志记录。

启用日志记录需要更改参数组。审计日志需要在将重放的工作负载之前启用,因为这里将提取连接和 SQL 查询。

从快照中还原 2 个节点 ra34xlarge 的 预配置集群 启动基线副本。通过将快照还原到 32 RPU 的 无服务器命名空间 启动生产者仓库。消费者不应包含将从生产者共享的模式和表。您可以从快照启动 64 RPU 无服务器消费者,然后删除相关对象,或者可以创建新的 64 RPU 无服务器消费者仓库并重新创建消费者用户。从生产者到消费者,创建数据共享,并添加相关对象。

数据共享对象可以使用两种机制进行读取:进行三段式命名 (databaseschematable),或创建一个指向共享模式的外部模式,并使用二段式命名进行查询 (externalschematable)。由于我们希望无缝运行使用局部对象的源工作负载,因此本文演示后者的方法。对于每个从生产者共享的模式,在消费者上运行以下命令:

sqlCREATE EXTERNAL SCHEMA schemaname FROM REDSHIFT DATABASE datasharedatabasename SCHEMA schemaname

确保外部模式使用与源相同的模式名称。此外,如果运行涉及公共模式的查询,首先在创建外部等效体之前,删除本地公共模式。

授予相关用户对模式的使用权限。

配置 Redshift Test Drive 工作负载复制器

创建一个 S3 存储桶,用于存储工具所需的工件例如指标、提取的工作负载和运行 UNLOAD 命令的输出数据。使用配置推荐的 m58xlarge、32GB SSD 存储和 Amazon Linux AMI 启动以下三种类型的 EC2 实例:基线实例目标生产者实例目标消费者实例

确保可以连接到 EC2 实例以运行工具。

对于每个实例,安装所需的库,完成 GitHub 仓库 中的步骤: a 第 2 i 步 b 第 2 ii 步如果需要使用 ODBC 驱动程序 默认是 Amazon Redshift Python 驱动程序 c 第 2 iii 步 d 第 2 iv 步 e 第 2 v 步

创建一个 AWS 身份与访问管理 (IAM) 角色,以便 EC2 实例能访问 Amazon Redshift 仓库,读取 S3 审计日志存储桶,以及对新创建的存储 REplay 工件的 S3 存储桶具有读写权限。

如果要运行 COPY 和 UNLOAD 命令,请创建一个 IAM 角色,以便访问所需的 S3 存储桶,并将其附加到将执行加载和卸载的 Amazon Redshift 仓库。

在本示例中,IAM 角色附加到基线副本和生产者仓库,因为这些将执行 ETL 处理。工具将更新 UNLOAD 命令,以卸载数据到您定义的存储桶,该位置作为最佳实践应为用于 S3 工件的存储桶。需要授予 Amazon Redshift 仓库对此位置的写入权限。

评估使用 Redshift Test Drive 和高级 SQL 分析的 Amazon Redshi

运行 Redshift Test Drive 工作负载复制器

在 EC2 实例上运行 aws configure 并用您在其中执行工具的区域填充默认区域。提取只需要运行一次,因此连接到基线 EC2 实例并运行 vi config/extractyaml 以打开 extractyaml 文件并配置提取详细信息选择 i 开始配置元素,然后使用 escape 离开编辑模式,使用 wq! 离开 vi。有关参数的更多详细信息,请参见 配置参数。

以下代码是配置提取的示例,卸载日志的时间窗口为半小时到 Test Drive 工件存储桶,并更新 COPY 命令以使用 POC Amazon Redshift 角色。

运行 make extract 以提取工作负载。完成后,注意提取参数中 workloadlocation 参数指定的路径创建的文件夹。在同一基线 EC2 实例上,该实例将对源副本运行完整工作负载,运行 vi config/replayyaml 并配置使用前一步中复制的工作负载位置和基线仓库端点的详细信息。有关参数的详细信息,请参见 配置参数以运行提取作业。在 analysisiamrole 参数之后的值可以保持默认。

以下代码是源副本重放配置的示例开头。

在将运行目标生产者工作负载的 EC2 实例上,运行 vi config/replayyaml。使用前一步中复制的工作负载位置、生产者仓库端点和其他配置,如第 4 步所示。为了仅重放生产者工作负载,添加适当的用户以包含或排除过滤器参数。

在将运行目标消费者工作负载的 EC2 实例上,运行 vi config/replayyaml 并配置使用前一步中复制的工作负载位置、消费者仓库端点和适当的过滤器,如第 5 步所示。在消费者工作负载重放中应包括当时在生产者工作负载重放中被排除的相同用户。

在基线实例、目标生产者实例和目标消费者实例上同时运行 make replay,以在目标仓库上运行工作负载。

分析工作负载复制器的输出

在前一步中创建的 S3 存储桶中创建文件夹结构。

plaintext{comparisonstatss3path}/{whatiftimestamp}/{clusteridentifier}/

对于 comparisonstatss3path,输入 S3 存储桶和路径名称。对于 whatiftimestamp,输入重放开始时间。对于 clusteridentifier,输入目标集群名称以便于识别。

使用以下脚本提取每个目标集群的系统表数据到之前在基线 Redshift 集群使用 QEv2 创建的相应 Amazon S3 目标路径。

sqlUNLOAD (SELECT aTrim(uusename) as username FROM sysqueryhistory a pguser uWHERE auserid = uusesysidand astarttime gt totimestamp({whatiftimestamp}YYYYMMDDHH24MISS)) TO {comparisonstatss3path}/{whatiftimestamp}/{clusteridentifier}/FORMAT AS PARQUET PARALLEL OFF ALLOWOVERWRITE IAMROLE {redshiftiamrole}

在 Amazon Redshift 中创建外部模式,名称为 comparisonstats。

sqlCREATE EXTERNAL SCHEMA comparisonstats from DATA CATALOGDATABASE redshiftconfigcomparisonIAMROLE {redshiftiamrole}CREATE EXTERNAL DATABASE IF NOT EXISTS

在 Amazon Redshift 中创建外部表,名称为 redshiftconfigcomparisionaggregate,基于 Amazon S3 文件位置。

sqlCREATE EXTERNAL TABLE comparisonstatsredshiftconfigcomparisionaggregate (userid intqueryid bigintquerylabel VARCHARtransactionid bigintsessionid intdatabasename VARCHARquerytype VARCHARstatus VARCHARresultcachehit booleanstarttime timestampendtime timestampelapsedtime bigintqueuetime bigintexecutiontime biginterrormessage VARCHARreturnedrows bigintreturnedbytes bigintquerytext VARCHARredshiftversion VARCHARusagelimit VARCHARcomputetype VARCHARcompiletime bigintplanningtime bigintlockwaittime bigintusername VARCHAR)PARTITIONED BY (clusteridentifier VARCHAR)STORED AS PARQUETLOCATION {comparisonstatss3path}/{whatiftimestamp}

创建分区表后,使用以下语句更改表,以将分区注册到外部目录。

添加分区时,您需要定义 Amazon S3 中包含分区数据的子文件夹的位置。对每个集群标识符运行该语句。

sqlALTER TABLE comparisonstatsredshiftconfigcomparisionaggregate ADD PARTITION (clusteridentifier={clusteridentifier})LOCATION {comparisonstatss3path}/{whatiftimestamp}/{clusteridentifier}/

示例:

sqlALTER TABLE comparisonstatsredshiftconfigcomparisionaggregate ADD PARTITION (clusteridentifier=baselinera34xlarge2)LOCATION s3//workloadreplicatorredshift/20240305210000/baselinera34xlarge2/

ALTER TABLE comparisonstatsredshiftconfigcomparisionaggregate ADD PARTITION (clusteridentifier=producerserverless32RPU)LOCATION s3//workloadreplicatorredshift/20240305210000/producerserverless32RPU/

ALTER TABLE comparisonstatsredshiftconfigcomparisionaggregate ADD PARTITION (clusteridentifier=consumerserverless64RPU)LOCATION s3//workloadreplicatorredshift/20240305210000/consumerserverless64RPU/

部署 QEv2 SQL 笔记本并分析工作负载

在本节中,我们将分析在基线和目标集群中重播的查询。我们将根据在基线和目标集群中执行的公共查询分析工作负载。

从 Amazon S3 下载 分析笔记本。使用 QEv2 将笔记本导入基线 Redshift 集群。有关指导,请参见 编写和运行笔记本。在创建外部模式的同一数据库中创建存储过程 commonqueriessp。存储过程将通过查询之前创建的外部表 redshiftconfigcomparisonaggregate 创建名为 commonqueries 的视图。

此视图将识别两个基线和目标集群之间的共同查询。

通过传递基线和目标集群的标识符作为参数,执行存储过程。

在本文中,我们将基线和生产者集群标识符作为参数传递。通过将集群标识符作为参数传递将仅检索特定集群的数据。

创建的 commonqueries 视图后,您可以使用笔记本中可用的后续查询进行进一步分析。如果您有多个目标集群,可以对每个集群执行相同的分析过程。在本文中,我们有两个目标集群:生产者和消费者。我们首先对基线和生产者集群之间进行分析,然后重复相同过程分析基线与消费者集群的数据。

要分析我们的工作负载,我们将使用 sysqueryhistory 视图。我们通常会使用该视图中的几个列,包括以下内容:

elapsedtime 查询运行的端到端时间executiontime 查询花费的运行时间。在 SELECT 查询的情况下,这还包括返回时间。compiletime 查询花费的编译时间

有关 sysqueryhistory 的更多信息,请参见 SYSQUERYHISTORY 的 Amazon Redshift 数据库开发指南。以下表格显示了分析查询的描述。

查询名称描述1按用户划分的总工作负载2按查询类型划分的总工作负载