AWS Redshift 列式存储与分布方式

Posted

技术标签:

【中文标题】AWS Redshift 列式存储与分布方式【英文标题】:AWS Redshift columnar storage vs distribution style 【发布时间】:2017-10-19 18:21:01 【问题描述】:

我一直在查看 AWS 文档,但似乎无法理解分发方式的工作原理以及该数据如何存储在 Redshift 上。我了解什么是列式存储数据库,但是当我阅读有关 Redshift 分布样式的文档时,我对数据如何存储在节点上感到困惑。分布方式就是将新加载的数据按行分布到计算节点的切片上。

例如,EVEN 分配方式定义为:

均匀分布

领导节点将行分布在一个切片中 循环方式,无论任何特定的值如何 柱子。当表没有时,均匀分布是合适的 参与 join 或 KEY 之间没有明确选择时 分布和所有分布。均匀分布是默认的 分发方式。

如果数据是按行分布的,那么数据究竟如何存储到列式存储中。数据分发到计算节点后,列式存储是否生效?

以下是讨论列式存储和分布样式的 AWS 文档的链接:

Columnar Storage Distribution Styles

【问题讨论】:

【参考方案1】:

每个 Amazon Redshift 集群都有多个节点。每个节点都分为 slices,分配有 CPU 和磁盘存储空间。

表中的每一列都是单独存储的,因此具有 3 列的表每个切片至少需要 3 个。这就是 Redshift columnar 的原因——每一列都是单独存储的。

每个块的大小为 1 MB,并且是独立压缩的。

见:Why does a table in my Amazon Redshift cluster consume more disk storage space than expected?

分布键决定了哪些行存储在哪些切片上。请记住——每个切片对表中的每一列都有自己的存储空间,但行分布在切片之间。 (除了 ALL 的分布,它将每一行放入每个节点。)

在切片上特定列的存储中,数据根据排序键进行排序。

【讨论】:

现在说得通了。关键信息是“每个切片对表中的每一列都有自己的存储空间,但行分布在切片之间”。因此,如果有两个表,每个表有 3 列,那么每个切片至少需要 6 个块,对吗? 没错!对于小表来说效率不高,但数据仓库的表中通常有数十亿行,最有效的方法是分发数据以进行并行处理。

以上是关于AWS Redshift 列式存储与分布方式的主要内容,如果未能解决你的问题,请参考以下文章

分布式列式数据存储系统Druid

AWS Redshift ETL的几个性能最佳实践

为啥像 Snowflake 和 Redshift 这样的列式数据库不能更改列顺序?

战斗民族开源神器!ClickHouse为什么能够征服各个大厂?

什么是列式存储数据库?

彻底理解大数据的列式存储