Azure Synapse SQL 体系结构
本文介绍 Synapse SQL 的体系结构组件。 本文还介绍 Azure Synapse SQL 如何将分布式查询处理功能与 Azure 存储结合使用,以实现高性能和可伸缩性。
Synapse SQL 体系结构组件
Synapse SQL 使用横向扩展体系结构将数据的计算处理分布在多个节点上。 计算与存储是分开的,这使你可以独立于系统中的数据来缩放计算。
对于专用 SQL 池,缩放单位是计算能力的抽象,称为数据仓库单位。
对于无服务器 SQL 池,将根据查询资源需求自动进行缩放。 拓扑会随时间而变化(添加、删除节点或进行故障转移),SQL 按需版本可以适应变化,确保查询具有足够的资源并成功完成。 例如,下图显示了使用 4 个计算节点执行查询的无服务器 SQL 池。
Synapse SQL 使用基于节点的体系结构。 应用程序将 T-SQL 命令连接到、发布给控制节点,该节点是 Synapse SQL 的单一入口点。
Azure Synapse SQL 的控制节点利用分布式查询引擎来优化查询以进行并行处理,然后将操作传递给计算节点以实现并行工作。
无服务器 SQL 池的控制节点利用分布式查询处理 (DQP) 引擎,通过将用户查询拆分为将在计算节点上执行的较小查询,来优化和协调用户查询的分布式执行。 每个小查询称为一个任务,表示分布式执行单元。 它从存储中读取文件,联接其他任务的结果,对从其他任务检索到的数据进行分组或排序。
计算节点将所有用户数据存储在 Azure 存储中并运行并行查询。 数据移动服务 (DMS) 是一项系统级内部服务,它根据需要在节点间移动数据以并行运行查询和返回准确的结果。
通过分离存储和计算,使用 Synapse SQL 时,无论存储需求如何,都可以受益于计算能力的独立调整。 对于无服务器 SQL 池,缩放是自动执行的,对于专用 SQL 池,你可以:
- 在专用 SQL 池中增加或减少计算能力,无需移动数据。
- 在保持数据不受影响的情况下暂停计算容量,因此只需为存储付费。
- 在操作期间恢复计算容量。
Azure 存储
Synapse SQL 使用 Azure 存储来确保用户数据安全。 由于数据由 Azure 存储进行存储和管理,因此会针对存储使用量单独收费。
无服务器 SQL 池允许查询数据湖文件,而专用 SQL 池允许查询和引入数据湖文件中的数据。 将数据引入专用 SQL 池中时,数据将分片到分布区中,以优化系统性能。 可选择在定义表时用于分布数据的分片模式。 支持以下分片模式:
- 哈希
- 轮循机制
- 复制
控制节点
控制节点是体系结构的核心。 它是与所有应用程序和连接进行交互的前端。
在 Synapse SQL 中,分布式查询引擎在控制节点上运行,可优化和协调并行查询。 将 T-SQL 查询提交到专用 SQL 池时,控制节点会将其转换为可针对每个分布区并行运行的查询。
在无服务器 SQL 池中,DQP 引擎在控制节点上运行,通过将用户查询拆分为将在计算节点上执行的较小查询,来优化和协调用户查询的分布式执行。 它还为每个节点分配要处理的文件集。
计算节点
计算节点提供计算能力。
在专用 SQL 池中,分布区映射到计算节点以进行处理。 如果支付更多计算资源费用,SQL 池会将分布区重新映射到可用的计算节点。 计算节点数的范围是 1 到 60,它由专用 SQL 池的服务级别确定。 每个计算节点均有一个节点 ID,该 ID 会显示在系统视图中。 在名称以 sys.pdw_nodes 开头的系统视图中找到 node_id 列即可查看计算节点 ID。 有关这些系统视图的列表,请参阅 Synapse SQL 系统视图。
在无服务器 SQL 池中,将为每个计算节点分配任务以及要对其执行任务的文件集。 任务是指分布式查询执行单元,实际上是用户提交的查询的一部分。 可进行自动缩放,以确保利用足够多的计算节点来执行用户查询。
数据移动服务
数据移动服务 (DMS) 是专用 SQL 池中的一项数据传输技术,它可协调计算节点间的数据移动。 某些查询需要移动数据以确保并行查询返回准确的结果。 需要移动数据时,DMS 可确保正确的数据到达正确的位置。
分发
分布区是并行查询的基本存储和处理单元,这些查询针对专用 SQL 池中的分布式数据运行。 当专用 SQL 池运行查询时,工作会被分割成 60 个并行运行的小型查询。
每个小型查询各在一个数据分布区上运行。 每个计算节点管理其中一个或多个分布区。 具有最多计算资源的专用 SQL 池的每个分布区占 1 个计算节点。 具有最小计算资源的专用 SQL 池的所有分布区占 1 个计算节点。
哈希分布表
哈希分布表可为大型表上的联接和聚合提供最高查询性能。
为了将数据分片到哈希分布式表中,专用 SQL 池使用哈希函数明确将 1 个行分配到 1 个分布区。 在表定义中,可以将一个列指定为分布列。 哈希函数使用分布列中的值将 1 个行分配到 1 个分布区。
下图说明了如何将完整的非分布式表存储为哈希分布表。
- 一个行属于一个分布区。
- 通过确定性哈希算法将一个行分配到一个分布区。
- 不同大小的表显示,每个分布区的表行的数目各不相同。
选择分布列时需考虑到性能,例如特异性、数据倾斜,以及在系统上运行的查询类型。
轮循分布表
轮循机制表是最简单的表,在被用作负载临时表时,它可创造和提供高速性能。
轮循机制分布表在表中均匀分布数据,但不会进行进一步优化。 首先随机选择一个分布区,然后将行的缓冲区按顺序分配给分布区。 将数据加载到轮循机制表速度很快,但就查询性能而言,哈希分布式表的性能更佳。 联接循环表要求重新组织数据,因此需要额外的时间。
复制表
复制表为小型表提供最快查询性能。
复制表在每个计算节点上缓存表的完整副本。 因此复制表以后,无需在执行联接或聚合前在计算节点中间传输数据。 复制表尤为适用于小型表。 它需要额外存储并且在写入数据时会产生额外开销,因此不适用于大型表。
下图显示会在每个计算节点的第一个分布区上缓存复制表。
后续步骤
对 Synapse SQL 有了初步的认识后,请学习如何快速创建专用 SQL 池和加载示例数据。 或开始使用无服务器 SQL 池。 如果不熟悉 Azure,在遇到新术语时,可以参考 Azure 术语表。