跳至主要内容

在 AWS 上使用 Redshift 的数据仓库完整指南

本指南涵盖 AWS Redshift 云数据仓库的搭建与管理、数据加载、复杂查询、性能优化、与 BI 工具集成,并提供成功所需的最佳实践与故障排查提示。
· 15分钟 阅读

使用 AI 探索

数据是现代组织的基石,但收集和存储的信息量日益庞大,管理起来颇具挑战。成功的关键在于高效组织和分析这些数据,从而挖掘有价值的洞见,支持明智决策。 

这正是数据仓库发挥作用的地方。它是一种强大的解决方案,帮助企业整合并优化数据以实现高效分析。而在数据仓库领域,AWS Redshift 脱颖而出,成为首选之一。 

本文将深入介绍 AWS Redshift,其关键特性、优势,以及在搭建、加载数据、查询、性能调优、安全与集成等方面的最佳实践。 

无论您是数据专业人士,还是希望充分利用数据的业务负责人,本文都将为您成功使用 AWS Redshift 提供必要的知识与工具。

什么是数据仓库?

数据仓库是一个从组织内各类来源收集、存储和管理大量结构化数据的过程。 

数据仓库的主要目标是提供一个集中式的信息库,使之能够被便捷访问、分析,并用于报表与决策。 

数据仓库旨在支持复杂查询与数据分析,帮助企业从数据中获取有价值的洞见。

数据仓库的重要性

采用数据仓库可为组织带来诸多益处:

Importance of Data Warehousing

数据仓库的重要性

  • 明智决策:数据仓库通过便捷访问历史数据与趋势,帮助组织做出数据驱动的决策。
  • 提升数据质量:数据仓库可整合并清洗多源数据,确保一致性与准确性,支持可靠洞见。
  • 提高效率:用户可快速访问并查询海量数据,而不影响业务系统,助力及时决策。
  • 竞争优势:通过数据仓库获得的洞见帮助组织识别新机遇、优化流程,并获得竞争优势。
  • 可扩展与高性能:数据仓库面向大规模数据与复杂查询设计,能在数据需求增长时保持稳定性能。

AWS Redshift 概览

什么是 AWS Redshift?

AWS Redshift 是一项全托管、云端的数据仓库服务,可存储并分析拍字节级数据集。借助 AWS Redshift Serverless,用户无需手动配置预置数据仓库,即可访问与分析数据。

Amazon Redshift

Amazon Redshift(来源)

该服务会自动预置资源,并智能扩展数据仓库容量,以确保即使在最苛刻且不可预测的工作负载下也能保持高速性能。用户仅为实际使用的资源付费,数据仓库空闲时不产生费用。

AWS Redshift 使用户能够通过 Amazon Redshift Query Editor v2 或偏好的商业智能(BI)工具立即加载并查询数据。该服务在易于使用、零运维的环境中,提供极具性价比的性能与熟悉的 SQL 功能。

无论数据集规模如何,AWS Redshift 都能通过当今常用的基于 SQL 的工具和 BI 应用提供快速的查询性能。

AWS Redshift 的关键特性与优势

AWS Redshift 提供多种功能与优势,帮助组织高效存储、管理和分析海量数据。部分关键特性与优势如下所示:

AWS Redshift Features and Benefits

AWS Redshift 的功能与优势

关键特性

  • 可扩展性:Redshift 可从数百 GB 扩展至 PB 级及以上。
  • 列式存储与压缩:采用列式存储与数据压缩以优化查询性能。
  • 全托管:无需手动设置、配置与维护。
  • 安全性:提供稳健的安全能力,包括静态与传输中加密、VPC 集成与 IAM 角色。
  • 熟悉的 SQL 接口:提供熟悉的 SQL 接口,并兼容主流 BI 工具。

关键优势

  • 性能:通过优化的查询性能实现快速数据分析。
  • 成本效益:用户仅为消耗的存储与计算资源付费。
  • 易用性:让用户能快速开始数据查询与可视化。
  • 可扩展性:无需人工干预即可适应不断增长的数据需求。
  • 集成性:与多种工具与服务集成,支持端到端数据方案。

设置 AWS Redshift

之前的部分主要聚焦于 Redshift 的整体认知。现在,我们将进入技术层面。 

本节先说明成功搭建 AWS Redshift 的主要先决条件,然后逐步演示创建 Redshift 集群的过程。最后将详细解释关键集群设置,如节点类型、节点数量与安全配置。 

先决条件

在深入用例细节之前,先了解实现成功部署所需的先决条件: 

  • AWS 账户:用于访问 AWS 服务,可在 AWS 官网创建。 
  • SQL 技能:用于提取与组织数据;我们的SQL 入门课程是很好的起点。
  • AWS IAM:需要了解 AWS 身份与访问管理(IAM),以便为所用的 Lambda 函数设置正确的权限。 
  • AWS 服务的基础知识:熟悉 AWS EC2 与 S3,有助于理解本文内容。
  • 编码技能:Python 基础编码技能,便于使用库与工具与 Redshift 交互。 

创建并配置 Redshift 集群

本节通过 11 个简单步骤,展示如何通过 AWS 管理控制台创建 Redshift 集群,如下所示:

1. 在控制台中搜索 Redshift,并选择“Amazon Redshift”:

Search and select Redshift from Management Console

在管理控制台中搜索并选择 Redshift

2. 选择“Create Cluster”按钮开始创建集群。

Create cluster button

创建集群按钮

3. 完成上述操作后,可通过提供集群标识符、集群大小、节点类型、可用区选择、节点数量等信息来配置集群。

Cluster configuration in 8 steps

8 步完成集群配置

4. 与其使用同页所示的示例数据,我们将改用来自 S3 存储桶的数据加载至 Redshift。

Ignore loading sample data option

忽略加载示例数据选项

5. 我们可以通过提供 IAM 角色来定义集群权限。本节可先忽略,稍后再处理。

Ignore cluster permissions and IAM roles

忽略集群权限与 IAM 角色

6. 网络、安全、备份、维护等保持默认配置,选择“Create cluster”按钮创建集群。

Leave the default configurations for network, security, backup, maintenance, and select the “Create cluster” button to create the cluster.

创建集群

7. 完成上述操作后,将跳转至显示新建集群的页面。创建过程需数分钟,您可在“Status”栏查看状态,先为“Creating”,随后变为“Available”。

Cluster state from “Creating” to “Available”

集群状态由“Creating”到“Available”

将数据加载到 Redshift

我们已成功创建 Redshift 集群。本节将指导您从在我们的 DataLab 上选择国家、地区与全球 GDP(国内生产总值)数据集,到将其上传至 S3 存储桶的全过程。

关于数据

我们的数据最初来源于世界银行数据集,包含以当前美元($)计价的各国、各地区及全球 GDP。地区指国家集合,如欧洲、中亚等。

数据的前十条观测如下:

First ten observations of the GDP data

GDP 数据的前十条观测

使用 AWS S3 加载数据

要使 S3 与 Redshift 成功交互,我们需先创建 IAM 角色,然后创建用于存储数据的 S3 存储桶。 

创建 IAM 角色

创建 IAM 角色的好处在于,它在 Redshift 集群与存放数据的 S3 存储桶之间建立连接。

创建 IAM 角色的步骤如下:

在管理控制台中搜索“IAM”,并在搜索结果中选择“IAM”图标。

IAM service from Management Console

管理控制台中的 IAM 服务

选择“Roles”查看所有可用角色,并点击“Create role”创建新角色。

Start creating a new role

开始创建新角色

在“Trusted entity type”中选择“AWS service”,在“Use case”中选择“Redshift”,然后点击“Next”继续。

Steps 5 to 8 of the AMI role creation

AMI 角色创建的第 5 至 8 步

在搜索栏中查找“S3FullAccess”,勾选该选项并选择“Next”。

Steps 9 to 10 of the AMI role creation

AMI 角色创建的第 9 至 10 步

最后,为角色命名、检查配置,并点击“Create role”按钮完成创建。

Steps 11 to 12 of the AMI role creation

AMI 角色创建的第 11 至 12 步

创建成功后,页面右上角会显示绿色的角色创建确认信息。

Role creation confirmation message

角色创建确认信息

将 IAM 角色关联至 Redshift

现在我们已有 IAM 角色,可将其关联至先前创建的 Redshift 集群,步骤如下:

在集群列表中选择创建的 datacamp 集群,在“Actions”中选择“Manage IAM roles”。

Link IAM role to Redshift steps 1 to 2

将 IAM 角色关联至 Redshift 的第 1 至 2 步

在该页面中,选择刚创建的 IAM 角色并保存更改。

Link IAM role to Redshift steps 3 to 4

将 IAM 角色关联至 Redshift 的第 3 至 4 步

使用 Redshift 查询编辑器连接

有多种工具可用于在 Redshift 中查询数据,其中一些属于 AWS 服务,另一些为外部工具。在本教程中,我们使用 Redshift 控制台中的查询编辑器。

使用前需先创建与查询编辑器的连接,方法是从“Query data”选项卡选择“Query in query editor”:

Query editor from query data

从 Query data 进入查询编辑器

上述操作会进入如下页面,您可在此为连接命名并设置用户名后连接至数据库:

Database connection from query editor

查询编辑器中的数据库连接

为数据创建表

点击“Connect”后,顶部会显示绿色的“Connected”标签,左侧可见数据库信息。

Result after connecting to the database

连接数据库后的界面

如上所示,数据库中尚无任何资源/数据。在导入数据前,我们需先创建一个与待导入数据结构一致的表。 

First 10 observations and table columns format matching

前 10 条观测与表字段格式对应

使用以下 SQL 查询创建表:

CREATE TABLE gdp_data (
id INTEGER PRIMARY KEY,
country_name VARCHAR(255),
country_code VARCHAR(10),
year INTEGER,
value DECIMAL(20,2)
);

下面逐列解释该 SQL 查询:

  • id INTEGER PRIMARY KEY:创建名为“id”的整型字段,并将其设为表的主键,确保每行取值唯一。
  • country_name VARCHAR(255):创建名为“country_name”的可变字符字段,最长 255 个字符。
  • country_code VARCHAR(10):创建名为“country_code”的可变字符字段,最长 10 个字符。
  • year INTEGER:创建名为“year”的整型字段,适合存储年份等整数。
  • value DECIMAL(20,2):创建名为“value”的定点数值字段,总精度 20 位,小数位 2 位。

现在运行该查询以创建表:

Query to create the table

创建表的查询 

该查询将创建名为“gdp_data”的表,包含上述字段,用于存储 GDP 数据,如下所示:

GDP data table created from SQL query

通过 SQL 查询创建的 GDP 数据表

为数据创建表

数据将从 S3 存储桶导入到该表。本节涵盖创建存储桶与上传数据的全部步骤。

在管理控制台中找到 S3 服务,进入相应页面,为存储桶命名,其余保持默认:

S3 bucket creation

创建 S3 存储桶

创建完成后,可在历史创建的存储桶列表中看到该存储桶。

The newly created bucket

新创建的存储桶

接着选择存储桶名称,上传本地下载的 CSV 格式 GDP 数据。

Page to upload data into the bucket

上传数据到存储桶的页面

成功导入数据后,将如下所示可见:

The CSV uploaded into the bucket

上传到存储桶的 CSV

Copy 命令:语法与示例

恭喜您读到这里!

本节演示如何将 S3 中的数据复制到 Redshift,示例如下。

COPY gdp_data (id, country_name, country_code, year, value)
FROM 's3://gdp-data-bucket/gdp/gdp_data.csv'
IAM_ROLE 'arn:aws:iam::654654631565:role/RedshiftS3FullAccess'
CSV
IGNOREHEADER 1;

我们来理解其中发生了什么:

  • COPY gdp_data (id, country_name, country_code, year, value):指定要复制数据的目标表与列。
  • FROM 's3://gdp-data-bucket/gdp/gdp_data.csv':指明 S3 存储桶中的源文件。
  • IAM_ROLE 'arn:aws:iam::654654631565:role/RedshiftS3FullAccess':使用指定的 IAM 角色访问 S3 存储桶。
  • CSV:表示文件格式为 CSV(逗号分隔值)。
  • IGNOREHEADER 1:指示 Redshift 忽略第一行(通常为表头)。

编辑器中的同一段代码如下所示,几秒后复制操作成功完成:

COPY task completed

COPY 任务已完成

为简化起见,我们并未上传原始 CSV 的全部数据,而是随机抽取了 100 条记录。可通过如下“Preview data”选项预览数据:

Preview of the randomly uploaded 100 observations

随机上传的 100 条记录预览

在 Redshift 中查询数据

数据预览仅展示前十条记录。但我们可能需要更深入地与数据交互以获取更多洞见,此时具备 SQL 技能将大有裨益。

本节通过若干 SQL 查询来探索数据。

基础 SQL 查询

我们将使用五个 SQL 查询与数据库中的数据交互,从最常见的查询(选择数据)开始。 

选择所有数据

SELECT *
FROM gdp_data;

Result of the first query

第一条查询的结果

选择特定国家的数据:

SELECT * FROM gdp_data
WHERE country_name = 'Senegal';

Result of the second query

第二条查询的结果

计算特定年份的平均 GDP 值:

SELECT year, AVG(value) as average_gdp
FROM gdp_data
WHERE year = 2020
GROUP BY year;

Result of the third query

第三条查询的结果

查找某一年 GDP 最高的前 5 个国家:

SELECT country_name, value
FROM gdp_data
WHERE year = 2020
ORDER BY value DESC
LIMIT 5;

Result of the fourth query

第四条查询的结果

统计每年的记录数:

SELECT year, COUNT(*) as record_count
FROM gdp_data
GROUP BY year
ORDER BY year;

Result of the fifth query

第五条查询的结果

高级查询技巧

上述查询提供了对数据的基础了解,本节将介绍三种高级查询技巧。

窗口函数

计算累计总和:该查询按年份为每个国家计算 GDP 值的累计总和。

SELECT
    country_name,
    year,
    value,
    SUM(value) OVER (PARTITION BY country_name ORDER BY year) as running_total
FROM gdp_data;

Result of the running total

累计总和的结果

使用公用表表达式(CTE)

用于筛选与聚合的 CTFs:此查询使用 CTE 筛选出 2020 年及以后的记录,然后计算每个国家的平均 GDP 值。

WITH recent_data AS (
    SELECT
        country_name,
        year,
        value
    FROM gdp_data
    WHERE year >= 2020
)
SELECT
    country_name,
    AVG(value) as average_gdp
FROM gdp_data
GROUP BY country_name;

Result from the CTEs

CTE 的结果

使用自连接

计算逐年(YoY)GDP 增长率:通过该查询,我们计算每个国家的同比 GDP 增长。

SELECT
    a.country_name,
    a.year,
    a.value as current_year_value,
    b.value as previous_year_value,
    (a.value - b.value) / b.value * 100 as growth_percentage
FROM gdp_data a
JOIN gdp_data b
    ON a.country_name = b.country_name
    AND a.year = b.year + 1;

Result of the self-join query

自连接查询的结果

性能调优

为确保最佳性能与成本效益,必须理解影响 Redshift 性能的因素,并采用最佳实践对集群进行调优。 

本节将探讨 Redshift 性能调优的关键方面,并基于提供的集群信息给出一些见解。

理解 Redshift 性能

Amazon Redshift 的性能受多种因素影响,从硬件配置到查询优化技术皆是如此。理解这些因素有助于定位瓶颈,并做出更优决策以提升集群性能。

我们配置了由两个 ra3.4xlarge 节点组成的 Redshift 集群,当前使用的数据仅为 391 KB。 

此外,下图显示在整个时间段内,集群的 CPU 利用率始终接近 0%,表明集群未被充分利用,针对当前工作负载可能存在过度预置。

CPU Utilization of our cluster

集群的 CPU 利用率

影响 Redshift 性能的关键因素包括:

  • 集群配置:节点类型与节点数量对性能影响显著。需基于工作负载选择合适配置。
  • 数据分布与倾斜:将数据均匀分布至各节点并尽量减少倾斜,可在查询执行时降低数据移动,从而优化性能。
  • 查询复杂度与优化:编写高效查询并利用 Redshift 的查询优化功能,能显著提升性能。
  • 工作负载管理:有效管理与优先级调度,确保关键查询获得所需资源并保持最佳性能。

性能优化最佳实践

要优化集群性能,需在表设计与数据管理上遵循最佳实践。即便数据集较小,落实这些实践也能为未来的增长与性能效率打下坚实基础。

  • 分布风格与键:选择合适的分布风格与分布键对数据在节点间的均匀分布与减少查询期间的数据移动至关重要。在我们这种小数据集、双节点的场景下,分布的影响或许不那么关键,但从可扩展性考虑仍属最佳实践。
  • 排序键:基于经常用于排序、筛选与连接的列选择合适的排序键,可显著提升查询性能。通过在摄取阶段完成排序,Redshift 能以更优化的方式组织数据。
  • 压缩编码:根据列的数据类型与基数应用合适的压缩编码,可减少存储占用并提升查询性能。使用 COPY 命令或 CREATE TABLE AS SELECT 语句时,Redshift 可通过采样自动选择最优编码。

监控与维护

定期监控与维护集群对于确保最佳性能与成本效率至关重要。下图展示了我们每月的 Redshift 成本分布,提示存在成本优化空间。

Cost and usage graphic for the current Redshift use case

当前 Redshift 用例的成本与用量图

基于上图,我们的 Redshift 集群相对于当前小数据集存在过度预置,导致利用率低且成本效率不高。 

借助 Amazon CloudWatch 与 AWS 管理控制台等工具,我们可监控关键性能指标,包括 CPU 利用率与查询性能。这些洞见有助于识别潜在问题,并做出数据驱动的集群优化决策。

鉴于集群利用率较低,我们可考虑以下成本优化策略:

  • 通过 Cost Optimization Hub 在不使用时暂停集群
  • 调整为更小的实例类型以匹配工作负载需求
  • 若工作负载间歇或不可预测,探索使用 Amazon Redshift Serverless

随着数据量增长与工作负载演变,请持续监控集群性能,并相应地重新评估实例规格与优化策略。

安全与合规

在 Amazon Redshift 中处理敏感数据时,确保最高标准的安全与合规至关重要。面对不断增加的监管要求与保护敏感信息的需要,实施稳健的安全措施并遵循合规指南,成为管理 Redshift 集群的关键环节。

合规与数据安全最佳实践

对处理敏感数据的组织而言,遵守行业监管与数据保护法律是首要任务。Amazon Redshift 提供多种功能,帮助我们有效满足这些合规要求。

除合规外,在 Amazon Redshift 中落实数据安全最佳实践,对于防止未授权访问与潜在泄露、保护敏感信息同样至关重要。

image24.png

数据安全最佳实践

定期审计

开展定期安全审计对于识别漏洞、评估现有安全措施的有效性并确保持续合规至关重要,可考虑以下审计实践:

  • 定期审查用户访问权限并移除不必要的授权
  • 监控并分析日志,留意可疑活动或未授权访问尝试
  • 执行漏洞扫描与渗透测试以识别潜在薄弱环节
  • 验证对内部安全策略与外部法规的合规性

数据脱敏

数据脱敏是一种在保留数据结构与格式的同时,对敏感要素进行掩码处理的技术。通过脱敏可在维护隐私的同时防止未授权访问。以下是在 Amazon Redshift 中进行数据脱敏的一些方法:

  • 动态数据脱敏:基于用户角色与权限在实时查询中掩盖敏感数据
  • 静态数据脱敏:为非生产环境创建脱敏后的数据副本
  • 令牌化:以不可逆的令牌替换敏感数据以保护其机密性

访问控制

实施强有力的访问控制机制至关重要,以确保只有授权人员才能访问 Amazon Redshift 集群中的敏感数据。可按如下方式落实: 

  • 使用 AWS 身份与访问管理(IAM)来管理用户认证与授权。
  • 实施基于角色的访问控制(RBAC),按用户角色与职责授予权限。
  • 启用多重身份验证(MFA)以增加一层安全保障
  • 定期审查并更新访问策略,以贯彻最小权限原则。

Cost and usage graphic for the current Redshift use case

CPU Utilization of our cluster

结论

本文探讨了在数据仓库场景下使用 Amazon Redshift 的基础与进阶内容。我们首先了解了数据仓库的重要性,以及 Amazon Redshift 如何以强大、可扩展且具成本效益的方式,借助 SQL 分析海量数据集。

随后,我们演示了搭建 Amazon Redshift 集群的流程,包括先决条件、集群创建与配置设置。我们还深入介绍了通过 AWS S3 与 COPY 命令将数据加载至 Redshift 的细节,并提供了语法示例与说明。

此外,我们覆盖了在 Redshift 中查询数据的要点,从基础 SQL 查询到窗口函数与复杂连接等高级技巧。我们也讨论了 Redshift 的性能调优,强调了分布风格、排序键与压缩编码等优化查询性能的最佳实践。

最后,我们强调了 Amazon Redshift 中安全与合规的重要性,涵盖了加密与访问控制等安全特性及相关合规考量。

后续步骤

若您希望进一步扩展使用 Amazon Redshift 与 AWS 的知识与技能,建议探索以下 DataCamp 资源:

  • 使用 Amazon Redshift 分析门票销售数据:这是一段动手实践的代码演练,带您使用 Amazon Redshift 分析门票销售数据,获得查询与可视化的实战体验。
  • AWS 入门:该课程系统介绍 AWS 服务与概念,帮助您为使用 AWS 与 Redshift 打下坚实基础。
  • Redshift 入门:通过这门专题课程更深入学习 Amazon Redshift,涵盖数据加载、查询优化与故障排查等进阶主题。

通过掌握 Amazon Redshift 并充分发挥其能力,用户可以从数据中解锁有价值的洞见,做出数据驱动的决策。

Zoumana Keita

作者

Zoumana Keita

一位多才多艺、乐于分享知识并回馈他人的数据科学家。Zoumana 是 YouTube 内容创作者,也是 Medium 上的顶尖科技写作者。他热爱演讲、编程与教学。Zoumana 拥有两个硕士学位:其一是在法国巴黎获得的计算机科学硕士,专注于机器学习;其二是在美国德州理工大学获得的数据科学硕士。他的职业生涯始于法国 Groupe OPEN 的软件开发工程师,随后加入 IBM 担任机器学习顾问,为保险公司构建端到端的 AI 解决方案。之后,Zoumana 加入了 Axionable——一家总部位于巴黎与蒙特利尔的首家“可持续 AI”初创公司。在那里,他担任数据科学家,为来自法国、蒙特利尔、新加坡和瑞士的客户交付 AI 产品,主要聚焦 NLP 场景。此外,他将 5% 的时间投入到研发工作。目前,他在 IFC(世界银行集团)担任高级数据科学家。

主题