论文笔记《Amazon Redshift Re-invented》
Categories: Scholar
Amazon Redshift Re-invented_论文分享
论文背景
2013年,Amazon Web Services推出了Amazon Redshift,这是首个全管理、pb级的企业级云数据仓库。Amazon Redshift使得使用现有的商业智能工具高效地分析大量数据变得简单而经济。与之相比, 传统的本地数据仓库解决方案价格昂贵,缺乏弹性,并且需要大量的专业知识来调优和操作。客户接受了亚马逊的Redshift,它成为AWS中增长最快的服务。
在过去的几年里,Amazon Redshift的用户规模不断扩大,作为回应,该服务也为客户提供一系列满意的创新。通过架构增强,Amazon Redshift保持了其行业领先的性能。Redshift通过分层存储、多集群自动伸缩、跨集群数据共享和AQUA查询加速层等创新改进了存储和计算的可伸缩性。Autonomics技术使得亚马逊的Redshift更容易使用。Amazon Redshift Serverless是Autonomics技术的巅峰之作,它允许客户在不需要设置和管理数据仓库基础设施的情况下run and scale analytics。最后,Amazon Redshift扩展了传统的数据仓库工作负载,通过与广泛的AWS生态系统集成功能,如使用Spectrum查询数据湖,半结构化数据输入和使用PartiQL查询,从Kinesis和MSK的流输入,Redshift ML,对Aurora和RDS运营数据库的federated查询,以及federated物化视图。
redshift的发展方向主要是满足用户四种需求:
- 客户要求对日益复杂的分析查询进行高性能执行。Redshift通过创新的查询执行,通过代码生成在每个查询片段中混合数据库操作符,提供了业界领先的数据仓库性能。最先进的技术,如预取和向量化执行,进一步提高了它的效率。这使得Redshift在处理从几兆位字节到拍字节的数据时可以线性扩展。
- 数据规模增长快。Redshift将其存储和计算层分解,以响应不断变化的工作负载。Redshift通过弹性地改变每个集群的大小来扩展,并通过自动添加和删除计算集群以处理客户工作负载峰值的多集群自动扩展来增加吞吐量。用户可以使用来自多个独立集群的相同数据集。
- 更易于使用。为此,Redshift 结合了基于机器学习的自主器,这些自主器根据客户工作负载的独特需求来重新调整每个集群。Redshift 自动workload管理、physical tuning和the refresh of materialized views (MVs),以及preprocessing that rewrites queries to use MVs.
- 能与AWS(Amazon Web Services)生态和相关服务无缝集成。Redshift 为事务数据库(例如,DynamoDB 和 Aurora )、Amazon S3 对象存储和 Amazon Sagemaker 的 ML 服务提供联邦查询。通过 Glue Elastic View,客户可以在 Redshift 中创建 Materialized 视图,这些视图在 DynamoDB 或 Amazon OpenSearch 中根据基本表的更新逐步刷新。Redshift 还提供了使用 SUPER 类型和 PartiQL 对半结构化数据的摄取和查询!
系统架构
- Compute
- 首先,最基本的部署配置,只会有一个 Redshift Compute Cluster(下文统一叫这个集群为主集群),包含一个 Leader Node(存元数据,与客户端交互,查询编译),多个 Compute Node(查询执行)。
- 其次,在主集群负载过高的情况下,Redshift 会自动扩容出额外的计算集群 Auto-scaling clusters 增加算力。用户查询会从主集群的 Leader Node 给 dispatch 过来(按我的理解,需要用到的主集群 Leader 节点上的元数据也会 dispatch 过来)。
- 最后,为了实现不同 workload 的隔离,可以创建一大堆的 Compute Isolation Clusters。Compuate Isolation Cluster 甚至可以和主集群从属于不同的 AWS 账号,实现跨客户的 Data Sharing。
- (补充:Compute 层可以联邦查询 RDS 以及远程调用 Sagemaker 中的模型。)
- Acceleration
- Spectrum Node 是 Spectrum 插件起的一堆用来查询 S3 data lake 上的数据的节点,可独立扩展。
- AQUA 用来做存储侧硬件加速计算,上面说过,这里就不解释了。
- CaaS 编译缓存服务,上面说过,这里就不解释了。
- Storage
- RMS(Redshift Managed Storage):Compute Node(RA3 实例)会 attach 到 RMS 上,RMS 管理一堆本地 SSD(我简单理解这个类似 SAN 存储放到了云上) 来 cache 数据,并且管理数据在 SSD 和 S3 之间的来回移动(cache eviction,prefetching,commit 等工作),这些工作对上层的 Compute Node 是透明的。RMS 会存储用户数据和事务的元数据。
- S3 既可以被 Spectrum Node 直接访问,也可以被 Compute Node 通过 RMS 间接访问。
query执行流程
- Leader接受query
- 随后解析、重写和优化
- 3中展示执行join的join key正好与分区键相同时, 如调用local join, 避免不必要的数据移动
- 优化后的查询计划会被划分成多个执行单元, 分配给多个compute node.对于每个单元,Redshift 生成高度优化的 C++ 代码, 编译成二进制文件传给computer node
- scan数据是从本地附加的 SSD 扫描的或来自 Redshift 管理存储的Redshift Managed Storage, 其中相关优化
- 每个块包含min/max索引, Bloomfilters, 尽可能减少扫描的数据量
- 针对列存延迟物化
- 基于SIMD命令快速解压缩Redshift的轻量级存储格式
论文具体工作
相关工作比较零散, 简单分类后进行介绍:
- cloud-native(包括弹性, Scalability, 易用性等)
- 存算分离, 计算和存储可独立扩展. 热数据缓存在计算节点的 attach 的 SSD 上(SSD 由 RMS 托管,与计算节点是分离的,下文会介绍 RMS),全量数据存储在 S3(2.1 Overview)
- 支持 Auto-scaling Clusters,即根据 workload 的需要自动添加和删除计算集群以处理客户工作负载的峰值(2.1 Overview)
- 支持 Compute Isolation Clusters和Data Sharing,允许客户在不同的 Redshift 计算集群和 AWS 帐户中安全且易于共享实时数据。数据可以在许多层次上共享,如模式、表、视图和用户自定义函数。(4.3 Compute Isolation)
- 支持Serverless. Serverless依赖于用于 Redshift 计算资源的自动配置、调整大小和缩放的算法。(5.6 Serverless Compute Experience)
- 传统的 Redshift 为客户提供了许多调整旋钮来优化他们的数据仓库环境(例如,实例类型、计算集群中的节点数量、工作负载管理队列、缩放策略),但Serverless 提供了一个接近于零的触摸界面。客户只需在查询运行几秒钟内支付。
- 支持自动化运维与调优(5 AUTOMATED TUNING AND OPERATIONS), 相比旧版尽可能减少用户操作
- 自动vacuum, analyze以及刷新materialized views
- 自动工作负载管理根据工作负载特征动态控制query的concurrency和内存分配
- 监视和分析客户工作负载,自动调优,例如,提供分区键和排序键的建议(Automatic Table Optimization (ATO))
- 支持与 AWS 宇宙无缝对接,包括 S3,Aurora,Lambda,Glue,Segmaker,Kinesis 等(6 USING THE BEST TOOL FOR THE JOB)
- 支持包括机器学习模型, 数据池, 联邦查询, 非结构化/半结构化数据存储,
- Lakehouse
- 支持通过 Spectrum 插件访问 S3 data lake 上的数据(6.1 Data in Open File Formats in Amazon S3)
- Real-time analysis
- 结合 AWS Kinesis 实现秒级实时分析
- 支持联邦查询 AWS 上的 RDS 数据库(e.g., Aurora)中的实时数据()
- AI技术 进行性能调优
- 支持 Automatic Workload Manager (AutoWLM) ,依靠机器学习模型来预测内存消耗和查询的执行时间,进而设置不同query的执行优先级(5.2 Automatic Workload Management,5.3 Query Predictor Framework)
- Redshift ML使用Amazon SageMaker,这是一个机器学习服务。在训练了模型之后,Redshift提供了一个SQL函数,该函数执行推断,可以直接在SQL查询中使用
- 新硬件
- 基于 AQUA 的存储侧硬件加速计算实现计算下推。有两个作用:a) 计算下推到存储侧能减少数据在网络中传输,尽量避免网络带宽瓶颈。b) AQUA 基于 AWS 自研的 Nitro 系统/芯片,FPGA 等技术实现,能够在成本可控的情况下大幅提升计算性能(2.9 AQUA for Amazon Redshift)
- 查询编译与执行
- 支持 code generation(生成 C++ 代码)和向量化 Scan 提升执行性能。通过 CaaS(Compilation as a Service) ,一个编译缓存服务,减小 SQL 编译带来的的开销。
- 多模
- 支持 SUPER 类型存储非结构化/半结构化数据,可以通过 PartiQL(一种 SQL 扩展)直接查询。
感兴趣的细节
存储如何扩展?
- 持久性和可用性。存储层构建在Amazon S3上,每次提交时都将所有数据持久化到Amazon S3。基于Amazon S3的构建允许Redshift将数据从操作数据的计算集群中分离出来。它还使数据持久,在其上构建一个体系结构可以提高可用性。
- 可伸缩性。使用Amazon S3作为基础可以提供几乎无限的规模。Redshift Managed Storage (RMS)利用数据块温度、数据块年龄和工作负载模式等优化来优化性能,并自动管理跨存储层的数据放置
- 性能。存储层扩展到内存和算法优化。它动态预取内存中的缓存并调整其大小,并将提交协议优化为增量提交。
RMS使就地调整集群大小成为纯粹的元数据操作,因为计算节点实际上是无状态的,并且总是可以访问RMS中的数据块。RMS是元数据绑定并且易于扩展,因为数据可以直接被摄取到Amazon S3中。RMS的分层特性(ssd作为缓存)使得交换硬件非常方便。rms支持的Redshift RA3实例目前提供了高达16PBs的容量。内存中的磁盘缓存大小可以动态更改,以平衡查询的性能和内存需求。
如何实验证明扩展能力?
本文也没有测试快速弹性的拓展能力. 但通过这个同时扩展CN和测试数据量, 最终处理时间几乎不变, 说明随着CN增长处理性能保持线性增长, 让用户能更好的为自己新的负载, 高性价比的配置相应资源.
论文目录
1 INTRODUCTION
2 PERFORMANCE THAT MATTERS
2.1 Overview
2.2 Introduction to Redshift Code Generation
2.3 Vectorized Scans
2.4 Reducing Memory Stalls with Prefetching
2.5 Inline Expression Functions
2.6 Compilation Service
2.7 CPU-Friendly Encoding
2.8 Adaptive Execution
2.9 AQUA for Amazon Redshift
2.10 Query Rewriting Framework
3 SCALING STORAGE
3.1 Redshift Managed Storage
3.2 Decoupling Metadata from Data
3.3 Expand Beyond Local Capacity
3.4 Incremental Commits
3.5 Concurrency Control
4 SCALING COMPUTE
4.1 Cluster Size Scaling
4.2 Concurrency Scaling
4.3 Compute Isolation
5 AUTOMATED TUNING AND OPERATIONS
5.1 Automatic Table Optimizations
5.2 Automatic Workload Management
5.3 Query Predictor Framework
5.4 Materialized Views
5.5 Smart Warmpools, Gray Failure Detection and Auto-Remediation
5.6 Serverless Compute Experience
6 USING THE BEST TOOL FOR THE JOB
6.1 Data in Open File Formats in Amazon S3
6.2 Redshift ML with Amazon Sagemaker
6.3 OLTP Sources with Federated Query and Glue Elastic Views
6.4 Redshift’s SUPER Schemaless Processing
6.5 Redshift with Lambda
相关
延迟物化
- 为了能够把底层存储格式(面向Column的), 跟用户查询表达的意思(Row)对应上,在一个查询的生命周期的某个时间点,一定要把数据转换成Row的形式,这在Column-Store里面被称为物化(Materization)。
- 我这里把物化理解为对象的实例化。
- 一般(Naive)的做法是从文件系统读出三列的数据,马上物化成一行行的person数据,然后应用两个过滤条件: id > 10 和 age > 20 , 过滤完了之后从数据里面抽出 name 字段,作为最后的结果
- 延迟物化的做法则会先不拼出行式数据,直接在Column数据上分别应用两个过滤条件,从而得到两个满足过滤条件的bitmap, 然后再把两个bitmap做位与(bitwise AND)的操作得到同时满足两个条件的所有的bitmap,因为最后用户需要的只是 name 字段而已,因此下一步我们拿着这些 position 对 name 字段的数据进行过滤就得到了最终的结果。
