技术干货 | 超实用!详解人大金仓MPP数据库并行查询技术

发布时间:2020-03-25

什么是MPP数据库?

人大金仓MPP数据库的

并行查询技术原理是什么?

如何实现并行查询?性能如何?

且听以下详细分解~


2020-03-25_113043.png

       KingbaseAnalyticsDB(简称KADB)是人大金仓为应对大数据时代海量数据分析处理的需求推出的具备高性能、高扩展能力的MPP数据库。它具有分布式集群部署、数据分片无共享存储、大规模并行处理技术(MPP)、数据分区、行列混存、数据库内压缩、MapReduce、在线扩容、内嵌数十种AI算法等技术特点,能满足当前各行业对大量数据采集、存储、挖掘及分析等多种需求的能力。


       目前,该产品主要定位于数据分析类应用市场,可处理PB级甚至更大存储量的数据,并能集成多种异构数据源进行数据挖掘和分析,在处理多表连接、聚合等各类复杂查询方面也体现出了很好的性能。


2020-03-25_113100.png



2020-03-25_113111.png

       MPP数据库并行查询技术主要是为了提升多节点并行查询时的查询性能而设计的。


       其设计思路如下:让用户的数据较均匀地分开存放在各集群计算节点上(采用哈希分布或随机分布等)——管理实例接受客户端查询请求——分析请求并生成查询计划——分发查询计划给计算实例并发查询。


       以数据库中最常见的join操作为例,假如两张表的分片字段上是等值连接,则各计算节点可根据自己负责的分片数据得出查询结果(管理实例会将查询直接发给各相关计算实例执行);否则,各计算实例必须依赖于其他计算实例的数据才能完成查询。此时,就需系统在执行计划树中插入一个数据传输节点(Motion)负责在不同计算实例之间传输数据。


       计算实例间的通信有3种方式:


     2020-03-25_113130.png

       每个计算实例将自己负责的执行结果发送给其他所有计算实例;


     2020-03-25_113140.png

       每个计算实例首先计算指定字段的HASH值,然后根据HASH结果将本条记录发送给对应的计算实例;


     2020-03-25_113151.png

       计算实例将执行结果发送给管理实例。


       需要说明的是,以上3种传输方式中,前两种传输是为了保证单个计算节点查询时数据的完整性,汇总传输是为了保证返回给用户数据的完整性。




2020-03-25_113212.png


       KADB按照Motion操作对查询计划进行分片(Slice),再将分片后的查询计划发送给计算实例进行并行查询。此时,不同的Slice可以并行执行查询,由此实现计算实例内和计算实例间的多级并行,保证查询实现最大的并行度。


       执行过程图和执行计划示意图如下图所示:


 2020-03-25_113223.png

2020-03-25_113234.png


       下面将以1个管理实例+2个计算实例的集群join操作的实际执行计划作具体说明:


       create table x(x1 int, x2 int, x3 int) distributed by (x1);

       create table y(y1 int, y2 int, y3 int) distributed by (y1);

       insert into x values(1,2,3);

       insert into x values(2,3,4),(3,4,5),(4,5,6);

       insert into y values(1,2,3);

       insert into y values(2,3,4),(3,4,5),(4,5,6);

       注:表默认hash分布。


     2020-03-25_113248.png

       select * from x join y on x1=y1;

       kingbase=# explain select * from x join y on x1=y1;

            QUERY PLAN                                  

       -----------------------------------------

         Gather Motion (slice1) 

            ->  Hash Join 

                   Hash Cond: x.x1 = y.y1

                   ->  Seq Scan on x 

                   ->  Hash  

                          ->  Seq Scan on y 


       当表x、y的join条件都是分布键x1、y1进行join时,因为相同值一定会hash到同一个计算实例中,因此只需每个计算实例在本地,根据本地的数据执行hashjoin,最终的结果返回给管理实例,管理实例统一收集返回给客户端即可。


     2020-03-25_113302.png

       select * from x join y on x1=y2; 

       kingbase=# explain select * from x join y on x1=y2;

                  QUERY PLAN

       ------------------------------------------

       Gather Motion 2:1  (slice2)  

       ->  Hash Join 

            Hash Cond: y.y2 = x.x1

           ->  Redistribute Motion 2:2  (slice1) 

                  Hash Key: y.y2

                  ->  Seq Scan on y 

            ->  Hash

                   ->  Seq Scan on x


       当表x、y的join条件不全是分布键(y2不是分布键)做join时,由于采用分布键做join表x列的x1数据已hash好,采用非分布键做join表y列的y2是随机分布的,因此每个计算实例需要根据非分布键做join表的y按照y2进行重新hash把数据分发给各节点,各节点在本地做join,也就是计划中有y表的Redistribute Motion,然后将最终结果返回给管理实例,管理实例统一收集返回给客户端。


     2020-03-25_113312.png

       select * from x join y on x1=y2; 

       kingbase=# explain select * from x join y on x2=y2;

            QUERY PLAN                                            

       ----------------------------------------------------

       Gather Motion 2:1  (slice2)

       ->  Hash Join

            Hash Cond: x.x2 = y.y2

            ->  Seq Scan on x

             ->  Hash  

                    ->  Broadcast Motion 2:2  (slice1)

                           ->  Seq Scan on y


       当表x、y的join条件都不是分布键(x2、y2不是分布键)做join时,表x列的x2数据是随机分布的,表y列的y2也是随机分布的。


       当x、y表存在小表情况,可把小表如表y的所有数据广播(Broadcast)到各节点,将每个计算实例本地表x数据和整个表y的数据做join,最终的结果返回给管理实例,管理实例统一收集返回给客户端即可。


       当遇到计算实例较多,x、y数据量较大的情况,可将表x、y分别按列x2、y2进行hash,对数据进行重新分发(Redistribute)。这样一来,每个计算实例的数据都是hash后的数据,再进行本地join,将最终结果返回给管理实例,管理实例统一收集返回给客户端即可。


       执行计划如下:

                 QUERY PLAN

       --------------------------------------------

        Gather Motion 2:1  (slice3)

          ->  Hash Join

                Hash Cond: (x.x2 = y.y2)

                ->  Redistribute Motion 2:2  (slice1)

                      Hash Key: x.x2

                      ->  Seq Scan on x

                ->  Hash

                      ->  Redistribute Motion 2:2  (slice2)

                            Hash Key: y.y2

                            ->  Seq Scan on y



2020-03-25_113329.png

       应用数的增加会带来数据量的增加,相应地,对查询性能的响应速度也提出了更高的要求。在单机数据库无法满足的情况下,可采用MPP集群的并行技术提高查询响应速度,MPP数据库的性能也会随着机器数的增长得到线性提升。


       以下是一个简单模拟采用MPP数据库的性能表现情况:


       2020-03-25_113404.png


       2020-03-25_113420.png


       2020-03-25_113431.png


       测试结论: 采用人大金仓MPP数据库KADB的集群技术能使查询速度随机器数量得到线性提升。




以客户为中心

人大金仓——做中国最优秀的数据管理软件与服务提供商


上一篇:关于北京人大金仓信息技术股份有限公司 下一篇:强强联合 | 线上生态大会第三弹强势来袭,邀您来听!