如何计算 Amazon Redshift Spectrum 的查询费用?

上次更新时间:2020 年 8 月 7 日

我想要计算从 Amazon Simple Storage Service (Amazon S3) 扫描数据时 Amazon Redshift Spectrum 中的查询费用。如何计算 Redshift Spectrum 查询使用量或费用,减少这些费用的最佳实践是什么?

简短描述

先决条件:

  • Amazon Redshift 集群。
  • 与您的集群连接以执行 SQL 命令的 SQL 客户端。
  • 两个 Amazon Redshift 集群和 Amazon S3 存储桶都必须在同一个区域中。

使用 Redshift Spectrum,您可以直接对 S3 中的数据运行 SQL 查询。将按照从 S3 中扫描的字节数向您收费。根据区域不同,可能会产生其他费用(扫描的每 TB 数据产生 5 USD 到 6.25 USD 费用)。字节数始终会向上取整到下一个兆字节 (MB),每次查询最少 10MB。有关更多信息,请参阅 Amazon Redshift 定价

注:CREATEALTER 等数据定义语言 (DDL) 语句或管理分区和失败的查询的 DROP TABLE 语句不产生费用。

解决方法

要计算估计的查询成本(以及获取在 Redshift Spectrum 中运行的所有 S3 查询的摘要),请使用 SVL_S3QUERY_SUMMARY 表。s3_scanned_bytes 列将返回从 S3 扫描发送到 Redshift Spectrum 层的字节数。

使用情况

您可以对 SVL_S3QUERY_SUMMARY 运行查询来确定 queryID 传输的字节数:

SELECT s3_scanned_bytes
FROM SVL_S3QUERY_SUMMARY
WHERE query=<queryID>;

要确定从 S3 扫描的所有字节数的总和,请使用以下查询:

SELECT sum(s3_scanned_bytes)
FROM SVL_S3QUERY_SUMMARY;

您还可以确定来自 Redshift Spectrum 的所有查询在特定时间间隔内的字节总数。下面的示例向您演示如何计算从前一天就开始执行的查询的所有字节总数:

SELECT sum(s3_scanned_bytes)
FROM SVL_S3QUERY_SUMMARY
WHERE starttime >= current_date-1; 

如果您在美国东部(弗吉尼亚北部)区域对 S3 存储桶运行此查询,Redshift Spectrum 将对每 TB 收取 5 USD。如果 s3_scanned_bytes 的总和在查询 SVL_S3QUERY_SUMMARY 时返回 621900000000 个字节,表示您拥有 0.565614755032584TB(当您将字节数转换为 TB 时)。

621900000000 bytes = 621900000000/1024 = 607324218.75 kilobytes
607324218.75 kilobytes = 607324218.75/1024 =  593090.057373046875 megabytes
593090.057373046875  megabytes =  593090.057373046875 /1024 = 579.189509153366089 gigabytes
579.189509153366089  gigabytes =  579.189509153366089/1024 = 0.565614755032584 terabytes 

在本示例中,您的使用量大约 0.5657TB。要计算 Redshift Spectrum 的使用成本,将它乘以每 TB 的成本:

$5 * 0.5657= $2.83

您还可以使用以下 SQL 查询来计算 Redshift Spectrum 使用费用:

SELECT
   round(1.0*sum(s3_scanned_bytes/1024/1024/1024/1024),4) s3_scanned_tb,
   round(1.0*5*sum(s3_scanned_bytes/1024/1024/1024/1024),2) cost_in_usd 
FROM SVL_S3QUERY_SUMMARY; 

在本示例中,针对您的 S3 存储桶中前一天扫描的数据查询 Redshift Spectrum 的费用。

注意:扫描数据量最高达 9.9MB 的所有查询向上取整,按 10MB 收取费用。失败或中止的查询不收取任何费用。

此外,系统日志表 (STL) 仅保留 2 到 5 天的日志历史记录,具体取决于日志使用情况和可用磁盘空间。因此,最佳实践是计算每天的查询费用并将它存储在另一个表中,从而保留已传输字节的记录。举个例子:

CREATE VIEW spectrum_cost AS
SELECT starttime::date as date, xid, query, trim(usename) as user, 
  CASE WHEN s3_scanned_bytes < 10000000 then 10 ELSE s3_scanned_bytes/1024/1024 end as scanned_mb, 
  round(CASE WHEN s3_scanned_bytes < 10000000 then 10*(5.0/1024/1024) 
  ELSE (s3_scanned_bytes/1024/1024)*(5.0/1024/1024) end,5) as cost_$ 
FROM svl_s3query_summary s 
LEFT JOIN pg_user u ON userid=u.usesysid 
JOIN 
(select xid as x_xid,max(aborted) as x_aborted from svl_qlog group by xid) q 
ON s.xid=q.x_xid 
WHERE userid>1 AND x_aborted=0
AND s.starttime >= current_date-1;

注:您还可以使用 CREATE TABLE 查询来计算并将数据存储在另一个表中。如果您不想指定时间段,请删除“current_date-1”。

计算自前一天从 S3 扫描到 Redshift Spectrum 的数据的总和。然后,通过运行以下查询计算总估计费用:

SELECT current_date-1 as query_since, SUM(scanned_mb) as total_scanned_mb, SUM(cost_$) as total_cost_$
FROM spectrum_cost;
Result:
  query_since | total_scanned_mb | total_cost_$
--------------+------------------+---------------
 2020-05-15   |            5029  |      0.02515 

Redshift Spectrum 最佳实践

要减少查询费用和提高 Redshift Spectrum 的性能,请考虑以下最佳实践:

  • 使用 Redshift Spectrum 的成本控制和并发扩展功能监控和控制您的使用情况。
  • 使用优化数据格式提高性能、降低成本。使用 PARQUET 和 ORC 等列式数据格式仅选择您想要从 S3 中扫描的列。
  • 如果数据不经常访问,将数据加载到 S3 中并使用 Redshift Spectrum。
  • 使用多个 Amazon Redshift 集群扩展并发时,在作业完成后立即终止这些集群。

Redshift Spectrum 的成本控制和并发扩展

通过使用 Redshift Spectrum 的成本控制和并发扩展功能,您可以创建每日、每周和每月的使用限制。当达到使用限制时,Amazon Redshift 会根据使用限制自动采取措施。

要从 Amazon Redshift 控制台配置成本控制,请执行以下步骤:

1.    登录 AWS 管理控制台。

2.    打开 Amazon Redshift 控制台

注:您还可以通过 AWS 命令行界面 (AWS CLI) 或 Amazon Redshift API 操作定义和管理使用限制。

3.    选择 Configure usage limit(配置使用限制)。

4.    更新以下配置设置:

Time period(时间段)(每日/每周/每月)

Usage limit(使用限制) (TB)

Action(操作)(提醒/记录日志到系统表/禁用功能)

注:Action(操作)功能可以帮助您管理您的使用限制。

要配置并发扩展使用限制,请执行以下步骤:

1.    登录 AWS 管理控制台。

2.    打开 Amazon Redshift 控制台

3.    将 Concurrency scaling usage limit(并发扩展使用限制)选为您的使用限制。

4.    更新以下配置设置:

Time period(时间段)(每日/每周/每月)

Usage limit(使用限制) (hh:mm)

Action(操作)(提醒/记录日志到系统表/禁用功能)

注:Time period(时间段)采用 UTC 时区。对于 Alert(提醒)和 Disable(禁用)功能,您还可以将 Amazon Simple Notification Service (SNS) 订阅附加到警报中。此外,如果您使用 Amazon Redshift 控制台启用提醒,系统将为这些指标自动创建 Amazon CloudWatch 警报。

其他成本控制要求和限制

管理您的 Redshift Spectrum 使用量和成本时,请注意以下要求和限制:

  • 使用限制适用于支持的版本 1.0.14677 或更高版本。
  • 您最多可以为每种类别添加 4 个限制和操作(总共 8 个限制)。
  • Redshift Spectrum 仅在可用 Redshift Spectrum 和并发扩展的区域受支持。
  • 每个功能只有一个限制可以使用 Disable(禁用)操作。
  • 使用限制一直都在,直到使用限制定义本身或集群被删除为止。
  • 如果您在期限中间创建限制,则测量从该时间点到定义期限结束的限制。
  • 如果您选择日志选项,请在 STL_USAGE_CONTROL 日志中查看详细信息。