我正在使用Redshift Spectrum。我创建了一个外部表,并在S3上上传了一个包含约550万条记录的csv数据文件。如果在这个外部表上执行查询,需要大约15秒钟,而如果在Amazon Redshift上运行相同的查询,只需要约2秒钟就可以得到相同的结果。AWS声称它是一个非常高效的平台,那么造成这种性能差异的原因是什么呢?请为使用spectrum获得相同性能提供解决方案。
我正在使用Redshift Spectrum。我创建了一个外部表,并在S3上上传了一个包含约550万条记录的csv数据文件。如果在这个外部表上执行查询,需要大约15秒钟,而如果在Amazon Redshift上运行相同的查询,只需要约2秒钟就可以得到相同的结果。AWS声称它是一个非常高效的平台,那么造成这种性能差异的原因是什么呢?请为使用spectrum获得相同性能提供解决方案。
以下是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的整体性能。
最后,我想指出一些有趣的文档,以更清楚地说明如何实现更好的性能改进。请参见末尾的参考资料!
很抱歉回答晚了。截至2018年2月,AWS已支持对列式格式(如Parquet、ORC等)文件进行AWS Spectrum查询。在您的情况下,您将文件存储为.CSV格式。CSV是基于行的,这会导致检索任何字段时都要提取整个行。我建议在查询之前将文件从.csv转换为Parquet格式。这肯定会带来更快的性能。详情请参见AWS:Amazon Redshift Spectrum