基本概念与原理

本章介绍DM MPP的一些基础概念与基本原理,虽然读者跳过这一章继续阅读后续章节也能进行DM MPP的相关操作,但是本章的阅读有利于读者进一步理解DM MPP的工作原理,对于后续对MPP系统的规划与管理能起到一定帮助。

2.1 基本概念

2.1.1 执行节点EP

DM MPP系统中每一个运行的DM数据库服务器实例称为一个执行节点EP,基于数据守护的MPP环境内的备库除外。

2.1.2 主、从EP

DM MPP采用完全对等无共享架构,对整个系统来说,每个EP作用都是一样的,用户可以连接到其中的任何一个进行操作。而对每个用户会话来说,EP具有主从之分。用户会话实际连接的那个EP对该用户会话来说称为主EP,其余的EP都称为从EP。

2.1.3 数据分布

DM MPP系统中的数据分布在各EP中,支持表数据的哈希分布、随机分布、复制分布、范围分布、LIST分布类型,用户可根据应用的实际情况为表数据选择合适的分布类型。

  • 哈希分布

哈希分布按照表定义中指定的一列或多列对行数据计算一个哈希值,再根据哈希值和哈希映射表,将该行数据分布到映射的节点上。

当表的连接查询中使用的连接键为哈希分布列时,MPP下的查询计划会进行优化,比如可能减少计划中通讯操作符个数、使用索引、对分组计划优化等,减少数据在节点间的分发,提高查询效率。

使用哈希分布时,节点间的数据是否均衡,取决于设置的哈希分布列以及表中的数据情况。当节点个数变动时,各个节点的数据需要按照新的哈希映射表重新进行分发。

  • 随机分布

随机分布表不存在分布列,插入表数据时会按照一定的随机算法,将数据随机均衡分布到各个节点。

随机分布的优点是数据和节点间不存在映射关系。节点个数变动后,如果没有节点数据均衡的要求,可以不用对节点现有的数据进行变动。

一般来说,随机分布对于复杂查询及存在较多的节点间数据分发情况,性能不如哈希分布高。

  • 复制分布

复制分布表在每个节点上的本地数据都是一份完整的拷贝,查询该表数据时在任意节点上都能单独完成,不需要从其他节点获取数据。

复制分布一般用于数据量不是很大的表。

  • 范围分布

范围分布按照表定义中指定的一个或多个列的列值范围分布项,决定将一行数据存储到MPP的哪个相应EP上。

  • LIST分布

LIST分布通过指定表中的一个或多个列的离散值集,来确定将一行数据存储到MPP的哪个相应EP上。此分布用于表中列值可列举的情况。

建议

DM MPP同时支持数据分布与分区表,实现了“数据分布后再分区”。在数据分布到各节点的基础上,再在单个节点上将数据再次分区,可进一步提高查询性能。分布的类型和分区的类型可以混合搭配,比如建立哈希分布表的范围水平分区表。

2.1.4 MAL系统

MAL系统是DM数据库实例间的高速通信系统,是基于TCP协议实现的一种内部通信机制,具有可靠、灵活、高效的特性。DM通过MAL系统实现实例间的消息通讯。

2.1.5 全局连接与本地连接

MPP系统中数据分布在各个EP中,用户只需要登录到某个EP,系统自动建立这个EP与其余EP的连接,因此用户建立的实际上是与整个MPP系统的全局连接,用户对数据库的操作通过全局连接在MPP系统的所有EP进行。使用全局连接时,要求MPP系统的所有EP都正常提供服务,否则无法建立连接。

DM MPP也提供本地连接。当使用本地连接时,用户登录到某个EP后,这个EP不再建立与其余EP的连接,用户的所有数据库操作仅在这个EP上进行。如SELECT语句以及UPDATE和DELETE语句中的WHERE条件中的子查询都仅仅查询本地EP的数据,而INSERT语句如果插入的数据根据分布定义应分布在其余EP时系统会报错。

通常在MPP系统正常运行时都使用全局连接,DM MPP的快速装载和动态扩容使用到了本地连接,用户在某些时候如MPP系统中有EP故障时也可以使用本地连接。

DM的各接口驱动程序都提供了连接属性用于设置全局连接(登录)或本地连接(登录),缺省都为全局连接。DM交互式工具DIsql也提供了登录参数MPP_TYPE用来指定使用全局连接或本地连接,“GLOBAL”表示全局连接,“LOCAL”表示本地连接,默认为全局连接。

2.2 MPP并行执行计划

在DM数据库中,SQL语句经过一系列的处理最终生成一棵由不同操作符组成的计划树,DM执行器以自底向上的顺序执行计划树,数据也按自底向上的顺序在计划树中流动并经过各操作符的处理,最终在计划树的根节点生成执行结果。

在DM MPP环境中各EP执行的是并行计划,并行计划是在单节点执行计划的基础上,按照一定规则于适当的位置插入MPP通讯操作符而生成的。

本节介绍DM MPP并行执行计划的原理与处理过程。

2.2.1 并行计划相关操作符

MPP并行执行计划是在单节点执行计划的基础上增加MPP通讯操作符生成的,DM MPP相关通讯操作符有5个,如下表所示。

表3.1 MPP并行执行计划通讯操作符
操作符名称 功能
MPP GATHER (MGAT) 主EP收集所有节点数据 从EP将数据发送到主EP
MPP COLLECT (MCLCT) 在MGAT的基础上,增加主从EP执行同步功能,避免数据在主EP上堆积。
一个计划树中一般只会在较上层出现一个MCLCT,但可能有多个MGAT
MPP DISTRIBUTE (MDIS) 各EP节点间相互分发数据,按照分发列计算行数据的目标节点并发送过去,目标节点负责接收
MPP BROADCAST (MBRO) 功能类似MGAT,收集数据到主EP,该操作符带有聚集函数运算功能,仅和FAGR配合使用
MPP SCATTER (MSCT) 主EP发送完整数据到所有从EP,保证每个节点数据都完整,一般和MGAT配合使用

2.2.2 并行计划的生成

在DM数据库中,计划树执行时,数据总是自底向上流动的,若是在MPP环境中,由于每个EP都只保存表的部分数据(复制分布除外),计划树叶子节点的数据都是不完整的,因此叶子节点向上传送的只是本EP部分的数据。要获得完整的正确执行结果,上层节点必须知道此时下层节点传来的数据是否完整,从而决定是否需要添加MPP通讯操作符,并根据单节点操作符的功能和数据分布情况决定应该添加何种通讯操作符。关于单节点执行计划操作符的介绍可以参看《DM8系统管理员手册》的附录。

下面通过几个简单的例子说明MPP并行计划生成的原理。

首先,在MPP环境中建两个表T1与T2,都使用哈希分布。

CREATE TABLE T1(C1 INT, C2 INT) DISTRIBUTED BY HASH(C1);

CREATE TABLE T2(C3 INT, C4 INT) DISTRIBUTED BY HASH(C3);
  • 例1:单表查询,查询表T1的全部数据。

使用EXPLAIN查看语句的执行计划:

EXPLAIN SELECT * FROM T1;

显示的并行执行计划如下:

1 ##NSET2: [0, 1, 16]

2	 ##MPP COLLECT: [0, 1, 16]; op_id(1) n_grp_by (0) n_cols(0) n_keys(0)

3		 ##PRJT2: [0, 1, 16]; exp_num(3), is_atom(FALSE)

4 			##CSCN2: [0, 1, 16]; INDEX33555445(T1)

可以看到,这条语句的并行执行计划只是在单节点执行计划中增加了一个MPP COLLECT通讯操作符,用于在从EP扫描和投影数据后,主EP收集所有EP的数据。

  • 例2:连接查询,连接键不是分布列的情况。

使用EXPLAIN查看语句的执行计划:

EXPLAIN SELECT * FROM T1 INNER JOIN T2 ON T1.C2=T2.C4;

显示的并行执行计划如下:

1 ##NSET2: [0, 1, 16]

2 	##MPP COLLECT: [0, 1, 16]; op_id(3) n_grp_by (0) n_cols(0) n_keys(0)

3 		##PRJT2: [0, 1, 16]; exp_num(4), is_atom(FALSE)

4 			##HASH2 INNER JOIN: [0, 1, 16]; KEY_NUM(1);

5 				##MPP DISTRIBUTE: [0, 1, 8]; op_id(1) n_keys(1) n_grp(0) filter(FALSE ) rowid_flag(0)

6					 ##CSCN2: [0, 1, 8]; INDEX33555445(T1)

7 						##MPP DISTRIBUTE: [0, 1, 8]; op_id(2) n_keys(1) n_grp(0) filter(FALSE) rowid_flag(0)

8 					##CSCN2: [0, 1, 8]; INDEX33555446(T2)

在这个并行计划中,哈希连接操作符“HASH2 INNER JOIN”的左右孩子CSCN2都各增加了一个MPP DISTRIBUTE通讯操作符,用于将数据按照连接键分发到各EP进行连接操作,之后计划的上层增加MPP COLLECT通讯操作符将各EP的连接和投影结果收集到主EP。

  • 例3:集函数查询,查询表T1的行数。

使用EXPLAIN查看语句的执行计划:

EXPLAIN SELECT COUNT(*) FROM T1;

显示的并行执行计划如下:

1 ##NSET2: [0, 1, 0]

2 	##MPP COLLECT: [0, 1, 0]; op_id(3) n_grp_by (0) n_cols(0) n_keys(0)

3 		##PRJT2: [0, 1, 0]; exp_num(1), is_atom(FALSE)

4 			##MPP BROADCAST: [0, 1, 0]; op_id(1)

5 				##FAGR2: [0, 1, 0]; sfun_num(1),

在这个并行计划中,集函数操作符FAGR2的上层增加了MPP BROADCAST通讯操作符,使得主EP可以收集并合并各从EP的集函数操作符执行结果。在此计划中,上层的MPP COLLECT操作符只起同步执行的作用,并不收集从EP的数据。

  • 例4:连接查询,执行计划中使用嵌套连接操作符的情况。

使用EXPLAIN查看语句的执行计划:

EXPLAIN SELECT * FROM T1 INNER JOIN T2 ON T1.C1<>T2.C4;

显示的并行执行计划如下:

1 ##NSET2: [49, 1, 16]

2 	##MPP COLLECT: [49, 1, 16]; op_id(4) n_grp_by (0) n_cols(0) n_keys(0)

3 		##PRJT2: [49, 1, 16]; exp_num(4), is_atom(FALSE)

4 			##SLCT2: [49, 1, 16]; T1.C1 <> T2.C4

5 				##NEST LOOP INNER JOIN2: [49, 1, 16];

6 					##NTTS2: [0, 1, 8]; for_mdis(TRUE)

7 						##MPP GATHER: [0, 1, 8]; op_id(1) n_grp_by (0) n_cols(0) n_keys(0)

8 						##CSCN2: [0, 1, 8]; INDEX33555445(T1)

9 					##NTTS2: [0, 1, 8]; for_mdis(TRUE)

10 						##MPP GATHER: [0, 1, 8]; op_id(2) n_grp_by (0) n_cols(0) n_keys(0)

11 						##CSCN2: [0, 1, 8]; INDEX33555446(T2)

以上举了几个简单的例子说明DM是如何在单节点执行计划中增加MPP通讯操作符生成MPP并行执行计划的。DM数据库的操作符众多,并行计划也复杂多变,这里不能一一介绍,用户可通过查看语句的并行执行计划体会DM MPP并行执行计划的生成规则。

2.2.3 数据分布与并行执行计划

在MPP环境中,建表时指定的数据分布类型决定了表数据的分布。DM MPP支持的表分布类型包括哈希分布、随机分布、范围分布、复制分布、LIST分布,数据插入或装载时系统会根据表的分布类型自动将数据发送到对应的EP。

哈希分布、范围分布和LIST分布的共同特征是在创建表的时候,用户指定一个或多个列作为分布列,系统会针对每个插入的数据行计算这些对应列的值,确定将数据所属EP。随机分布和复制分布则不需要指定分布列。

并行执行计划与数据分布密切相关,数据分布能够决定最终生成的并行计划。例如查询的数据经过预先判断发现正好都在一个EP上,服务器会做一定的优化,在最优的情况下,整个计划甚至不包含任何通讯操作符。优化的原则是尽量减少节点之间的通信交互。

因此,用户应根据应用中查询的实际需求来确定表的分布类型,进而得到较优的并行执行计划。

  • 场景一

在某应用中,查询语句中包含大量连接查询,表数据分布较为均匀,应用对查询的效率要求较高。此时我们可以使用哈希分布,并且将常用连接列作为哈希分布列,这样能尽可能地减少EP间的数据传递,少占用网络带宽,减少网络延迟,充分发挥多节点并行执行的巨大优势。

  • 场景二

在某应用中,查询以单表查询居多,连接查询较少,我们可以采用随机分布。随机分布使得海量数据能均匀分布,充分体现MPP的并行优势。

  • 场景三

对于单表查询或出现在连接查询中数据量较小的表,可采用复制分布。复制分布的表在每个EP上都有一份完整的数据拷贝,使得在生成并行执行计划时能减少对应通讯操作符的使用,进一步优化并行计划。

2.2.4 并行计划执行流程

DM MPP对于查询语句和插入/删除/修改语句的处理是不同的,因为插入/删除/修改语句涉及到数据的修改,必须在数据行所在EP进行修改操作,而查询语句只需要主EP收集查询结果即可。

2.2.4.1 查询语句处理流程

DM MPP对查询语句的处理按如下流程进行:

  1. 建立连接

用户连接到MPP系统内任意一个EP节点,则该EP为连接的主EP,其余节点为从EP;

  1. 生成执行计划

主EP解析查询语句,生成普通的查询计划后,根据数据分布情况在合适的位置插入合适的并行通讯操作符,生成最终的并行查询计划;

  1. 分发计划

主EP把执行计划分发给所有的从EP;

  1. 执行计划

各从EP收到计划后,生成执行计划的运行环境,所有EP并行执行,执行时各EP通过通讯操作符分发必要的数据并协调执行进度;

  1. 生成结果集

主EP收集所有EP的查询结果(包括自身数据),生成结果集;

  1. 返回结果集

主EP将结果集返回给用户

2.2.4.2 插入/修改/删除语句处理流程

DM MPP对插入/修改/删除语句的处理按如下流程进行:

  1. 建立连接

用户连接到MPP系统内任意一个EP节点,则该EP为连接的主EP,其余节点为从EP;

2.生成执行计划

主EP解析语句,生成执行计划,其中包含的查询计划(即WHERE条件对应的计划)也是并行查询计划,另外还会生成一个对应的在从EP上执行的计划(MPLN);

  1. 准备数据

主EP开始执行计划时首先把查询计划部分发布给所有的从EP,并行执行查询,主EP收集查询结果;

  1. 定位节点

数据准备完成后,根据分布列和分布方式计算出需要修改的行数据所在的目标EP,将MPLN以及操作所需数据发送到各对应的EP。如果目标EP为本地则不发送,在本地直接完成操作;

  1. 执行修改操作

从EP收到MPLN计划和数据后生成执行环境,执行实际的修改操作;

  1. 返回执行结果

主EP等待所有的从EP执行完成后才会返回执行结果给客户端,只要其中有任一个EP执行失败,则已经执行的所有EP都会回滚,保证数据的一致性,并返回错误信息给客户端。

2.2.5 DDL语句分发

与并行计划执行流程中介绍的DML语句并行执行计划处理流程不同,DM MPP对DDL语句的处理采用语句分发方式。主EP直接将DDL语句发送给各从EP,每个从EP各自执行该DDL语句。主EP等待所有的从EP执行完成后才返回消息给用户,只要其中有任一个EP执行失败,则已经执行的所有EP都会进行回滚,保证数据的一致性,并返回错误信息给客户端。

由于DDL语句分发,使得在MPP中登录任一EP执行的DDL操作都是全局的,包括数据库对象的建立、修改和删除等,也包括用户的建立、修改与删除。

2.3 相关配置文件

2.3.1 dm.ini MPP相关配置项

dm.ini是DM数据库实例的配置文件,通过配置该文件可以设置DM数据库服务器的各种功能和性能选项。dm.ini中的配置项多达数百个,涉及DM数据库运行各个方面的设置,这里我们只介绍与MPP相关的几个配置项,读者若对其他配置项感兴趣可以参看《DM8系统管理员手册》的相关章节。

表3.2 dm.ini MPP相关配置项
配置项 配置含义
INSTANCE_NAME 数据库实例名(长度不超过16个字符)
PORT_NUM DM服务器监听通讯端口号,服务器配置此参数,有效值范围(1024~65534),发起连接端的端口在1024-65535之间随机分配
MAL_INI MAL系统配置开关,0表示不启用MAL系统,1表示启用MAL系统,默认值为0
MPP_INI MPP系统配置开关,0表示不启用MPP系统,1表示启用MPP系统,默认值为0
MAX_EP_SITES MPP环境下EP节点的最大数量,有效值范围(2~1024),默认值为64
MPP_HASH_LR_RATE MPP下,对HASH JOIN节点,可以根据左右儿子CARD代价的比值,调整HASH_JOIN的左右儿子的MOTION添加,从而影响计划。如果CARD比值超过此值,则小数据量的一方全部收集到主EP来做。取值范围(1~4294967294),默认值为10
MPP_OP_JUMP MPP系统中操作符的跳转开关,是否支持通讯操作符的跳转功能。1:支持;0:不支持。取值范围:0、1,默认值为1
PHF_NTTS_OPT MPP系统中是否进行NTTS计划的优化,打开时可能减少计划中的NTTS操作符。1:支持;0:不支持。取值范围:0、1,默认值为1

另外,DM MPP要求MPP系统中每个EP的建库参数及dm.ini中一些配置参数的配置值必须一致,在用户第一次全局登录MPP系统时会进行检查,如果设置不一致,则会报错。

这些配置项如下表所示。

表3.3 MPP中每个EP必须设置相同的配置项
配置项配置含义
建库参数
BLANK_PAD_MODE设置字符串比较时,结尾空格填充模式是否兼容ORACLE,0:不兼容;1:兼容。默认为0
LENGTH_IN_CHARVARCHAR类型对象的长度是否以字符为单位,0:否,以字节为单位;1:是,以字符为单位。默认值为0
USE_NEW_HASH字符类型在计算HASH值时所采用的HASH算法类别,0:原始HASH算法;1:改进的HASH算法。默认值为1
dm.ini参数
COMPRESS_MODE建表时是否缺省压缩。0:不进行;1:进行。默认值为0
PARALLEL_POLICY用来设置并行策略。取值范围:0、1和2,缺省为0。其中,0表示不支持并行;1表示自动并行模式;2表示手动并行模式。默认值为0
LIST_TABLE默认情况下,创建的表是否为堆表,0:否;1:是。默认值为0
COMPATIBLE_MODE是否兼容其他数据库模式。0:不兼容,1:兼容SQL92标准,2:兼容ORACLE,3:兼容MS SQL SERVER,4:兼容MYSQL,5:兼容DM6,6:兼容Teradata。默认值为0
COUNT_64BITCOUNT集函数的值是否设置为BIGINT。0:否;1:是。默认值为1
ALTER_TABLE_OPT是否对加列、修改列、删除列操作进行优化,0:全部不优化;1:全部优化;2:打开快速加列,对于删除列和修改列与1等效。默认值为0
JSON_MODEJSON语法解析兼容模式。0:兼容ORACLE;1:兼容PostgreSQL。默认值为0
微信扫码
分享文档
扫一扫
联系客服