Redshift Spectrum 和 Node.js
我们的开发堆栈基于 Node.js,非常适合需要处理大量交易的高速轻服务器。然而,Node.js 环境有一些限制,要求我们创建变通方法并使用其他工具完成此过程。
Node.js 和 Parquet
由于 Node.js 缺乏 Parquet 模块,需要我们执行 AWS Glue/Amazon EMR 过程以将数据从 CSV 有效迁移到 Parquet。我们宁愿直接保存到 Parquet,但我们找不到有效的方法来执行此操作。
一个有趣的项目是通过称为 node-parquet 的 Marc Vertes 开发 Parquet NPM (https://www.npmjs.com/package/node-parquet)。它没有进入生产状态,但我们认为很值得跟进此生产包的进展。
时间戳数据类型
根据 Parquet 文档,时间戳数据以 64 位整数存储在 Parquet 中。然而,JavaScript 不支持 64 位整数,因为本机号码类型为 64 位双精度型,仅提供 53 位的整数范围。
因此,无法使用 Node.js 将时间戳正确存储在 Parquet 中。解决方法是将时间戳存储为字符串,并将类型转换为查询中的时间戳。使用这种方法,我们没有发现任何性能下降。
经验教训
您可以从我们的试错经验中获益。
经验 1:数据验证很关键
如前所述,分区中的一个条目损坏可能会导致对该分区运行的查询失败,尤其是在使用 Parquet 时,这比简单的 CSV 文件更难编辑。确保您验证数据后再使用 Redshift Spectrum 扫描数据。
经验 2:有效构造数据结构和对数据分区
使用 Redshift Spectrum(或者在此情况下使用 Athena)的一项最大益处是,您不需要一直保持节点的正常运行。您只需为您执行的查询及每个查询所扫描的数据付费。
在此情况下,为不同的查询保留不同的数据排列非常有意义。例如,您可以按日期和小时对数据进行分区,以运行基于时间的查询,也可以有一个按 user_id 和日期分区的集合,以运行基于用户的查询。这将提高数据仓库的运行速度和效率。
以正确的格式存储数据
随时使用 Parquet。Parquet 的益处非常多。性能更快、扫描的数据更少且柱状格式更高效。然而,它不支持 Kinesis Firehose 的开箱即用,因此,您需要执行自己的 ETL。AWS Glue 是一个非常好的选项。
为频繁的任务创建较小的表
当我们开始使用 Redshift Spectrum 时,我们发现 Amazon Redshift 的成本每天上涨数百美元。然后,我们意识到,我们没必要每分钟都扫描一整天的数据。利用在同一个 S3 存储桶或文件夹上定义多个表的能力,并为频繁查询创建临时表和较小的表。
经验 3:将 Athena 和 Redshift Spectrum 结合,以获得最大性能
迁移到 Redshift Spectrum 还能让我们利用 Athena,因为它们都使用 AWS Glue 数据目录。在利用 Amazon Redshift 高级查询引擎使用 Redshift Spectrum 进行复杂查询时,使用 Athena 运行快速而简单的查询。
运行复杂的查询时,Redshift Spectrum 更为突出。它可以将很多计算密集型任务(如谓词过滤和聚合)下推到 Redshift Spectrum 层,从而减少查询使用的集群处理能力。
经验 4:在分区类对您的 Parquet 数据进行分类
通过使用 sortWithinPartitions(sort_field) 在分区内对数据进行分类,我们实现了又一次性能改进。例如:
小结
我们非常高兴在过去的三年内将 Amazon Redshift 用作我们的核心数据仓库。但随着我们的客户群和数据量大幅增长,我们对 Amazon Redshift 进行了扩展,从而利用 Redshift Spectrum 的可扩展性、性能和成本。
Redshift Spectrum 让我们可以清楚的扩展到几乎无限的存储、扩展计算,并且可以为我们的用户提供超快的结果。利用 Redshift Spectrum,我们可以将数据以我们想要的成本存储在我们希望的位置,并且可提供数据供用户在需要时进行分析,且数据性能符合用户预期。
作者介绍:
Rafi Ton 拥有 7 年的广告科技经验和 15 年的领先科技公司经验,是 NUVIAD 的创始人兼 CEO。他喜欢探索并将新技术应用于尖端产品和服务中,在现实世界中创造真正的财富。作为一名经验丰富的企业家,Rafi 相信实用编程和快速适应新技术可以取得显著的市场优势。
本文转载自 AWS 技术博客。
评论