如何控制 Redshift 中不断增加的数据量?

Posted

技术标签:

【中文标题】如何控制 Redshift 中不断增加的数据量?【英文标题】:How to control increasing data volume in Redshift? 【发布时间】:2018-06-19 06:16:50 【问题描述】:

我在 AWS Redshift 中维护了一个数据仓库。数据量和速度最近都有所增加。一种选择当然是在更高成本的范围内保持水平扩展集群。我想知道是否有任何可用的归档选项,以便我可以像往常一样查询整个数据(可能会在查询时间上有所妥协),但成本很低或没有额外成本?

一种选择是使用外部表并直接从 S3 查询数据,但用于实现此目的的工具(如 Athena 和 Glue)有其自身的成本,这也是基于每个查询。

【问题讨论】:

雅典娜/胶水/红移光谱 = 这是一个很好的选择。如果您不经常查询,并且如果您正确组织表格,则成本可以降到最低。 不确定你是否已经探索过但有high disk and low computation系列的Redshift实例也是一种选择。 如果您不想有每次查询费用,您应该尝试 Presto。 (Athena 使用 Presto 的执行引擎) @PiotrFindeisen Presto 会和 Athena 一样快吗?我认为要让它快速运行,我们必须保持大型集群,这又意味着额外的成本。没有? 如果 Athena 与 Presto 开发保持同步,它会一样快。它不是,Presto 可以更快。权力越大,责任越大——您可能希望扩大和缩小集群。当然,如果您只是不时查询,那是不值得的,Athena 的按查询付费模式将是最佳的。 【参考方案1】:

简单的选择:

    确保所有表都有压缩SELECT * FROM svv_table_info;。 通过将大表更改为使用 ENCODE zstd 来最大限度地压缩。 将小于约 50k 行(取决于)的小表切换到 DISTSTYLE ALL(是的,这样可以节省空间!)。 从基于 SSD 的节点 (dc2) 切换到拥有更多 8 倍存储空间的 HDD 节点 (ds2)。

不太容易的选择:

    UNLOAD 从 Redshift 到 S3 的旧数据并使用 Redshift Spectrum 进行查询。 使用 AWS Glue 或 AWS EMR 将卸载的数据转换为 Parquet 或 ORC 格式,然后使用 Redshift Spectrum 进行查询。

请尝试使用 Redshift Spectrum。查询性能通常非常好,如果您的数据采用列格式(Parquet/ORC),查询性能会更好。

【讨论】:

从 DC2 切换到 DS2 节点有帮助!【参考方案2】:

存储在 Amazon Redshift 中的数据将提供最高性能。

但是,如果您有访问频率较低的数据,您可以将其导出 (UNLOAD) 到 Amazon S3,最好是作为压缩的分区数据并将其存储为 Parquet 或 ORC 会更好!

然后您可以在 Amazon S3 中使用 Amazon Redshift Spectrum to Query External Data。您甚至可以将外部数据与 Redshift 数据连接起来,这样您就可以在一个查询中查询历史信息和当前信息。

或者,您可以使用 Amazon Athena 直接从 Amazon S3 查询数据。这类似于 Redshift Spectrum,但不需要 Redshift。 Amazon Athena 基于 Presto,因此速度非常快,尤其是当数据以压缩、分区、Parquet/ORC 的形式存储时。

见:Analyzing Data in S3 using Amazon Athena | AWS Big Data Blog

请注意,Redshift Spectrum 和 Amazon Athena 根据从磁盘读取的数据量收费。因此,压缩、分区的 Parquet/ORC 更便宜并且更快。

【讨论】:

以上是关于如何控制 Redshift 中不断增加的数据量?的主要内容,如果未能解决你的问题,请参考以下文章

Redshift 集群中的切片数

如果我不断增加线程数,平均响应时间如何保持或多或少不变?

可路由计算引擎实现前置数据库

扫描外部表(S3 数据)时 Redshift Spectrum 中的成本控制

Amazon Redshift 大小增加

pandas使用pd.DateOffset生成时间偏移量(指定年数月数天数小时分钟)把dataframe数据中的时间数据列统一偏移(相加偏移向后移动时间时间增加)