为啥 Redshift 和 S3 之间的 AWS 文件大小不同?
Posted
技术标签:
【中文标题】为啥 Redshift 和 S3 之间的 AWS 文件大小不同?【英文标题】:why AWS file size is different between Redshift and S3?为什么 Redshift 和 S3 之间的 AWS 文件大小不同? 【发布时间】:2020-02-06 20:05:48 【问题描述】:我正在将表从 Redshift 卸载到 S3 以进行备份。因此,如果我们再次需要它们,我正在检查以确保文件是完整的。
我刚刚在一个大小为 1,056 的表上执行了 UNLOAD,根据:
select "table", size, tbl_rows
FROM svv_table_info;
根据文档,大小为“以 1 MB 数据块为单位”,因此此表使用 1,056 MB。但复制到 S3 后,文件大小为 154 MB(在 AWS 控制台中查看)。
我复制回 Redshift 并且所有行都在那里,所以这与“1 MB 数据块”有关。这与它在文件系统中的保存方式有关,是吗?
谁能解释一下?谢谢你。
【问题讨论】:
【参考方案1】:所以您问为什么SVV_TABLE_INFO
视图声称该表占用了 1 GB,但是当您将其转储到磁盘时结果只有 154 MB?
有两个主要原因。首先是您正在积极更新表,但没有清理它。当一行被更新或删除时,Redshift 实际上会追加一个新行(是的,存储为列)并删除旧行。要回收这个空间,你必须regularly vacuum the table。虽然 Redshift 会在后台进行一些吸尘,但这可能还不够,或者在您查看时可能还没有发生。
第二个原因是存储表数据需要开销。表中的每一列都存储为 1 MB 块的列表,每个切片一个块(每个节点多个切片)。根据集群的大小和列数据类型,这可能会导致大量空间浪费。
例如,如果您要存储 32 位整数,则一个 1MB 的块可以存储 256,000 个这样的整数,总共需要 4 个块来存储 1,000,000 个值(这可能接近您表中的行数)。 但是, 如果您有一个 4 节点集群,每个节点有 2 个切片(即 dc2.large
),那么您实际上需要 8 个块,因为该列将在所有切片上进行分区.
您可以在STV_BLOCKLIST 中查看每列使用的块数。
【讨论】:
太棒了。谢谢!以上是关于为啥 Redshift 和 S3 之间的 AWS 文件大小不同?的主要内容,如果未能解决你的问题,请参考以下文章
AWS Data Pipeline DynamoDB 到 S3 到 Redshift,包括 JsonPaths
带标签的 AWS S3、DynamoDB、Redshift?
如何使用 aws unload 命令将数据从 AWS Redshift 卸载到 s3?
从 AWS Redshift 到 S3 的 AWS Glue ETL 作业失败