我正在使用 Redhshift 频谱。我创建了一个外部表并在 S3 上上传了一个包含大约 550 万条记录的 csv 数据文件。如果在这个外部表上触发查询,大约需要 15 秒,而如果我在 Amazon redshift 上运行相同的查询,我会在大约 2 秒内得到相同的结果。在 AWS 声称它是非常高性能的平台的情况下,这种性能滞后的原因可能是什么。请建议使用频谱获得相同性能的解决方案。
4 回答
AWS 论坛的回复如下:
我了解到您在 Redshift 和 Redshift Spectrum 上运行相同的查询。但是,结果不同,一个运行 2 秒,另一个运行大约 15 秒。
首先,我们必须同意 Redshift 和 Spectrum 都是针对不同目的而设计的不同服务。它们的内部结构各不相同,而 Redshift 依赖于 EBS 存储,Spectrum 直接与 S3 一起工作。Redshift Spectrum 的查询采用大规模并行性,可以非常快速地针对大型数据集执行。大部分处理发生在 Redshift Spectrum 层中,大部分数据保留在 Amazon S3 中。
Spectrum 还旨在处理来自 Amazon S3 中文件的数 PB 数据结构化和半结构化数据,而无需将数据加载到 Amazon Redshift 表中,而 Redshift 让您能够以高度优化的方式高效存储数据分布和排序键。
AWS 并未宣传 Spectrum 作为 Redshift 的更快替代方案。我们提供 Amazon Redshift Spectrum 作为附加解决方案,以提供对存储在 Amazon S3 中的数据的访问,而无需将其加载到 Redshift(类似于 Amazon Athena)。
不幸的是,在查询性能方面,我们无法保证性能改进,因为 Redshift Spectrum 层产生的查询计划与 Redshift 的数据库引擎解释器产生的查询计划完全不同。这个特殊原因本身就足以阻止这些服务之间的任何查询性能比较,因为这对它们都不公平。
关于您关于动态节点的问题,Spectrum 会根据您的查询需求添加它们,Redshift Spectrum 可能会使用数千个实例来利用大规模并行处理。但是,没有任何特定标准可以触发此行为,但请记住,通过遵循有关如何提高查询性能 [1] 以及如何为查询创建数据文件 [2] 的最佳实践,您可以潜在地提高整个 Spectrum 的表现。
最后,我想指出一些有趣的文档,让您更清楚地了解如何实现更好的性能改进。请看文末参考资料!
这些结果是意料之中的。使用 Amazon Redshift 的全部原因在于它以高度优化的方式存储数据以提供快速查询。存储在 Redshift 之外的数据不会以同样快的速度运行。
Amazon Redshift Spectrum 的目的是提供对存储在 Amazon S3 中的数据的访问,而无需将其加载到 Redshift(类似于 Amazon Athena),但它不保证性能。
我回答这个问题有点晚了。截至 2018 年 2 月,AWS 支持对 Parquet、ORC 等列格式文件的 AWS Spectrum 查询。在您的情况下,您将文件存储为 .CSV。CSV 是基于行的,这会导致为查询的任何字段提取整行。我建议您在查询之前将文件从 .csv 转换为 Parquet 格式。这肯定会带来更快的性能。来自 AWS 的详细信息:Amazon Redshift Spectrum