查询而设计。AMPP 结构是 SMP 前端和 shared nothing 的 MPP 后端的完美结合。前端是 SMP 的高性能 Linux 主机。其主要功能是通过标准的接口(SQL、ODBC、JDBC、OLE DB)对外提供服务。SMP 主机负责编译从应用程序发出的查询请求,生成优化过的可执行代码片段,称之为 snippet,然后分发这些代码片段到所有的 S-Blades 上并行执行。当所有的 S-Blades 都执行完毕 SMP 主机汇总结果后把最终的结果返回给应用程序。后端是由大量的 S-Blades 组成,主要的数据操作过程都是在 S-Blades 上完成的。S-Blades 之间是相互独立的,每个 S-Blades 都会占有自己磁盘和数据片(data slice)在并行处理的时候并不会相互影响。这种结构的好处是可以通过增加 S-Blades 节点和其所使用的磁盘来使性能得到近似线性的提升。Netezza 1000 的 S-Blades 数量可以扩展到 120 个。在面对超大量数据的时候,这种分而治之的方法能收到立竿见影的效果。 这种结构也提供了极大的灵活性通过改变磁盘、S-Blades 和内存的配比来创建出不同型号的 Netezza 一体机。比如增加磁盘数量减少 S-Blades 数量,这样的一体机查询性能有所减弱,但数据容量有所增大。可以用来存放历史数据。
FPGA 与数据流处理
在架构层面上,灵活的 AMPP 架构是 Netezza 一体机具有高性能的一个重要因素,另外一个起到决定性作用的因素就是 Netezza 一体机引入的数据库加速卡和数据流处理概念。这些都发生在 S-Blades 里面,它们极大的增强了一体机数据处理能力。下面将更深入的进入到魔法发生的地方 -S-Blades 里面看看它的独特之处。 S-Blades 包括一个刀片服务器 (8 个 CPU 核 ) 和一块数据加速卡(8 个 FPGA 核)。正常情况下在 Netezza 1000 一体机中一个 S-Blades 管理 8 个数据片(data slices)。一个 CPU 核与一个 FPGA 核再加上一个数据片组成了一个逻辑的处理单元,称之为 Snippet Processor。每个 Snippet Processor 都独立的负责一个数据片的处理,这样当运行查询的时候一个 S-Blades 中就有个 8 个这样的逻辑处理单元并行的处理 8 个数据片。
CPU和 FPGA 各自都有明确的分工对任务的不同阶段进行处理,形成了流水线作业大大提高了性能。展示了一个逻辑处理单元(1 CPU 核 + 1 FPGA 核 + 1 数据片)各个组件的分工以及它们是如何协同工作的。 SMP 主机编译生成可执行的代码片段并且把它们分发到 S-Blades 上去执行。这个代码片段实际上包含两部分内容一部分是用来配置 FPGA 的参数另一部分是 CPU 可执行的程序。FPGA 配置好了参数之后便开始根据配置的参数来执行,这时将建立一个数据流。下面将结合一条 SQL 语句来解释一下数据是如何在流中被操作的。
SQL:select c1, c2, sum(c3) from t1 where c2=999 假设表 t1 包含 10 列分别是 c1 到 c10
1 FPGA 从数据片中读取所查询表 t1 的所有数据块到内存中 . 这里读取的知识表 t1 的一部分数据,其他的数据存储在其它的数据片上。
2 磁盘上所有的数据都是经过压缩的,压缩的好处是可以有效的减少磁盘的 IO。FPGA 对数据进行解压
3 FPGA 对数据进行投影操作,只保留操作中能用到的列。这样做可以减少数据的大小,使数据传输和处理起来都更加高效。效果对宽表尤其明显。SQL 语句中选择了 c1,c2 和 c3 三列其余的列都没有用到,这样只保存这三列其余列全部丢弃掉。
4 FPGA 对数据进行过滤,只保留用户应该得到的数据。这里有两层过滤一层是由于查询条件限制需要过滤掉的数据,SQL 语句中的 c2=999 会在这个阶段产生作用。还有一层过滤是要过滤掉还实物还没有提交的数据。
5 CPU 对过滤好的数据进行聚合、链接和汇总等操作。然后返回出这个逻辑处理单元的结果。SQL 语句中的 sum(c3) 在这个阶段被执行。
6 SMP 主机收到所有的逻辑处理单元的结果后再汇总得到最终结果,返回给用户。
这整个过程就像是一个工厂里面的装配线一样,当数据流过这条装配线就会得到结果。当工厂里面有成百上千条流线同时工作的时候,得到结果自然就是很快的事情。
关键技术特性
分区数据库与分区键
Netezza 是一个分区的数据库,一个表的数据是分布所有的数据片上的。一条记录存储在那个数据片上是由分区键来决定的。有两种方式来制定分区键,一是定义表的时候可以指定一个或多个列来作为表的分区键,另一个是用随机的方式(round-robin)来给记录分区。清单 3列出了其基本语法 . 如果指定了列作为分区键,Netezza 会根据所指定用哈希算法算出一条记录数据属于那个分区。如果没有指定分区键则自动用第一个列作为分区键
清单 3 指定分区键
Create table table_name(
Column_name1 data_type1
Column_name2 data_type2
Column_name3 data_type3)
[distribute on (column_name1, column_name2, … ] |
[distribute on random]
分区键的选择对性能的影响是至关重要的,这也是 Netezza 中为数不多的可以管理和调优的地方。应该尽可能的使数据均匀的分布在所有的数据片上。下面有一些基本的原则
· 选择有大量唯一值的列做分区键,列的唯一值的数量越多数据的分布就越均匀。不要使用 bool 类型的列作为分区键,那将会导致所有的数据只会分布在两个数据片上。
· 对于表关联的情况,应该选择关联条件里面的所有列作为两个表的分区键,这样关联操作只会在数据片自己的分区内发生。每个数据片都不会广播自己的数据到其它分区。
压缩
与传统的数据仓库不同的,在 Netezza 一体机中所有的用户数据都是经过压缩存储的,而并不像传统数据仓库那样可以选择不压缩进行存储,这也体现了 Netezza 的简单性。数据仓库中性能的瓶颈往往出现在磁盘上,数据压缩存储的好处是可以减少磁盘的 IO 压力,FPGA 引擎负责将数据解压缩成可读的内容。 Netezza 的压缩对用户来说是完全透明的,它支持所有的数据类型,不要任何的调优和管理。压缩算法把记录根据列分成不同的数据列流,对每个列流独立的进行压缩,但在 存储的时候保持行结构,这种具有专利的压缩算法保证了 4 到 32 倍的压缩率,极大的减少了磁盘 IO 的压力。
Zone Maps
Zone Maps 是 Netezza 很独特的技术,它可以使数据块在还没有被从磁盘上读出来之前就知道这块数据是否包含查询中所包含的数据,如果不包含则直接跳过该数据块。这种方式极大的减 少的磁盘的 IO,大大提高了查询的性能。传统的数据仓库则需要读出数据块然后再判断是否需要里面的数据。 Zone Maps 是什么呢?在 Netezza 中数据是以数据块的方式存储的磁盘上的,对数据的读写操作的最小单位是数据块,每个数据块的大小是 3MB。Zone Maps 保存了每