在生产中结合使用 Amazon Redshift Spectrum、Amazon Athena 和 AWS Glue 与 Node.js(四)

2020 年 1 月 13 日

在生产中结合使用 Amazon Redshift Spectrum、Amazon Athena 和 AWS Glue 与 Node.js(四)

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) 在分区内对数据进行分类,我们实现了又一次性能改进。例如:


df.repartition(1).sortWithinPartitions("campaign_id")…
复制代码


小结


我们非常高兴在过去的三年内将 Amazon Redshift 用作我们的核心数据仓库。但随着我们的客户群和数据量大幅增长,我们对 Amazon Redshift 进行了扩展,从而利用 Redshift Spectrum 的可扩展性、性能和成本。


Redshift Spectrum 让我们可以清楚的扩展到几乎无限的存储、扩展计算,并且可以为我们的用户提供超快的结果。利用 Redshift Spectrum,我们可以将数据以我们想要的成本存储在我们希望的位置,并且可提供数据供用户在需要时进行分析,且数据性能符合用户预期。


作者介绍:



Rafi Ton 拥有 7 年的广告科技经验和 15 年的领先科技公司经验,是 NUVIAD 的创始人兼 CEO。他喜欢探索并将新技术应用于尖端产品和服务中,在现实世界中创造真正的财富。作为一名经验丰富的企业家,Rafi 相信实用编程和快速适应新技术可以取得显著的市场优势。


本文转载自 AWS 技术博客。


原文链接:https://amazonaws-china.com/cn/blogs/china/big-data-using-amazon-redshift-spectrum-amazon-athena-and-aws-glue-with-node-js-in-production/


2020 年 1 月 13 日 14:53131

评论

发布
暂无评论
发现更多内容

架构师训练营第五周总结

xs-geek

极客大学架构师训练营

week1-作业一:食堂就餐卡系统设计

第五周总结

fmouse

Week_05 总结

golangboy

极客大学架构师训练营

Week 5 學習總結

--------世界中心---------

食堂就餐卡系统UML设计

Calvin

架构师

第一周作业-食堂就餐卡设计

hunk

极客大学架构师训练营

架构师训练营第五周命题作业

一马行千里

极客大学架构师训练营 命题作业

架构第五周作业

Geek_Gu

极客大学架构师训练营

食堂就餐卡系统设计

jizhi7

第五周 技术选型 学习总结

应鹏

学习 极客大学架构师训练营

架构第5周总结

Geek_Gu

极客大学架构师训练营

架构图

猴子胖胖

架构

学习总结-week1

Mr_No爱学习

5.4消息队列:如何避免系统故障传递?

张荣召

第五周学习笔记

张荣召

「架构师训练营第 1 期」第五周作业

张国荣

第一周作业总结

hunk

极客大学架构师训练营

week1- 作业二:周总结

架构师训练营第一周学习总结

张小胖

极客大学架构师训练营

第五周作业

Geek_ac4080

食堂就餐卡系统设计

张小胖

极客大学架构师训练营 张小胖

Week 5 作业01

Croesus

week1 学习总结

幸福小子

5.5负载均衡架构

张荣召

架构师训练营第一周学习总结

xiaomao

架構師訓練營第 1 期 - 第 05 周總結

Panda

架構師訓練營第 1 期

5.3分布式缓存架构:一致性hash算法

张荣召

第五周总结

Geek_ac4080

第一周 架构方法-学习总结

jizhi7

极客大学架构师训练营

Week 5 作業

--------世界中心---------

在生产中结合使用 Amazon Redshift Spectrum、Amazon Athena 和 AWS Glue 与 Node.js(四)-InfoQ