searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

teledbx SharedQueue介绍

2024-10-28 09:27:23
12
0

数据重分布介绍

       重分布是计算节点之间进行数据交换,以便完成分布式数据的关联(join)操作。

l发生在哪里

    datanode节点之间进行数据交换。

l何时需要

    datanode上面两表进行join,并且至少一张表是采用非分布key进行join时。

postgres=# explain select * from tbl_a, tbl_b where tbl_a.f1 = tbl_b.f2;
                                         QUERY PLAN                                         
--------------------------------------------------------------------------------------------
 Remote Subquery Scan on all (db1,db2)  (cost=140.38..503.73 rows=9112 width=16)
   ->  Hash Join  (cost=140.38..503.73 rows=9112 width=16)
         Hash Cond: (tbl_b.f2 = tbl_a.f1)
         ->  Remote Subquery Scan on all (db1,db2)  (cost=100.00..141.05 rows=1350 width=8)
               Distribute results by S: f2
               ->  Seq Scan on tbl_b  (cost=0.00..23.50 rows=1350 width=8)
         ->  Hash  (cost=23.50..23.50 rows=1350 width=8)
               ->  Seq Scan on tbl_a  (cost=0.00..23.50 rows=1350 width=8)
(8 rows)

如上面的执行计划,a表分布key join b表非分布key在每个dn上面进行,会分别去其他dn获取b表的数据。每个dn会按照b表的join key进行计算,然后把b表数据发送到对应dn节点上面。(相当于把B表以join key为分布列,让B表的数据重新分布)

SharedQueue

SharedQueue是用来完成数据重分布的数据结构,它具有如下特点:

 
一生产者多消费者的共享队列
第一个绑定sq的进程成为生产者进程,后面绑定的进程都是消费者进程
cursorSharedQueue name)来区分,发生重分布时,每个datanode上面都会有一个同名的SharedQueue
生产者Bind sq后创建发送线程,并为每个消费者创建一个缓冲区DataPumpBuf
生产者负责生成数据,发送线程来负责发送数据
每个线程负责部分dn消费者,生产者把数据放到缓冲区中,当缓冲区中数据大于一个阈值时,线程会将缓冲区中数据发送,当内存不够大的时候,会使用文件存储数据

SharedQueue执行流程:

SharedQueue的进程交互模型如下:

 

图中dn1,dn2代表dn1dn2上具体执行执行计划的进程
DN1不是复制DN2 tbl_b的全部数据,而是通过SharedQueuetbl_b做重分布
DN1上两个进程会同时绑定SharedQueue,先绑定的成为生产者,后绑定的成为消费者,DN2也是一样的情况
 
DataPump介绍

DataPump是用来实际存放生产者生产数据的环形队列

 

单生产和单消费的免锁队列,在SharedQueue中,生产者负责从执行器获取tuple,然后写入消费者相应的DataPumpBuf中,发送线程不断从DataPumpBuf中读取记录然后发送出去

 

 

三个重要的位置

 

Head:队列头,datapump最新写到的位置
Tail:队列尾,可读的起始位置
Border:可读边界,完整的记录边界,读者可以读到的范围为tailborder之间的数据,head为最新写的位置,但是可能不是一条完整的记录,写入完整记录后需要将border设置为head使其可读
 
 

 

SharedQueue的生产和消费

 

 

RemoteSubplan重分布函数调用流程

上层执行节点:

 

下层执行节点:

上下层节点交互关系如下:

 

0条评论
作者已关闭评论
西格玛
2文章数
0粉丝数
西格玛
2 文章 | 0 粉丝
西格玛
2文章数
0粉丝数
西格玛
2 文章 | 0 粉丝
原创

teledbx SharedQueue介绍

2024-10-28 09:27:23
12
0

数据重分布介绍

       重分布是计算节点之间进行数据交换,以便完成分布式数据的关联(join)操作。

l发生在哪里

    datanode节点之间进行数据交换。

l何时需要

    datanode上面两表进行join,并且至少一张表是采用非分布key进行join时。

postgres=# explain select * from tbl_a, tbl_b where tbl_a.f1 = tbl_b.f2;
                                         QUERY PLAN                                         
--------------------------------------------------------------------------------------------
 Remote Subquery Scan on all (db1,db2)  (cost=140.38..503.73 rows=9112 width=16)
   ->  Hash Join  (cost=140.38..503.73 rows=9112 width=16)
         Hash Cond: (tbl_b.f2 = tbl_a.f1)
         ->  Remote Subquery Scan on all (db1,db2)  (cost=100.00..141.05 rows=1350 width=8)
               Distribute results by S: f2
               ->  Seq Scan on tbl_b  (cost=0.00..23.50 rows=1350 width=8)
         ->  Hash  (cost=23.50..23.50 rows=1350 width=8)
               ->  Seq Scan on tbl_a  (cost=0.00..23.50 rows=1350 width=8)
(8 rows)

如上面的执行计划,a表分布key join b表非分布key在每个dn上面进行,会分别去其他dn获取b表的数据。每个dn会按照b表的join key进行计算,然后把b表数据发送到对应dn节点上面。(相当于把B表以join key为分布列,让B表的数据重新分布)

SharedQueue

SharedQueue是用来完成数据重分布的数据结构,它具有如下特点:

 
一生产者多消费者的共享队列
第一个绑定sq的进程成为生产者进程,后面绑定的进程都是消费者进程
cursorSharedQueue name)来区分,发生重分布时,每个datanode上面都会有一个同名的SharedQueue
生产者Bind sq后创建发送线程,并为每个消费者创建一个缓冲区DataPumpBuf
生产者负责生成数据,发送线程来负责发送数据
每个线程负责部分dn消费者,生产者把数据放到缓冲区中,当缓冲区中数据大于一个阈值时,线程会将缓冲区中数据发送,当内存不够大的时候,会使用文件存储数据

SharedQueue执行流程:

SharedQueue的进程交互模型如下:

 

图中dn1,dn2代表dn1dn2上具体执行执行计划的进程
DN1不是复制DN2 tbl_b的全部数据,而是通过SharedQueuetbl_b做重分布
DN1上两个进程会同时绑定SharedQueue,先绑定的成为生产者,后绑定的成为消费者,DN2也是一样的情况
 
DataPump介绍

DataPump是用来实际存放生产者生产数据的环形队列

 

单生产和单消费的免锁队列,在SharedQueue中,生产者负责从执行器获取tuple,然后写入消费者相应的DataPumpBuf中,发送线程不断从DataPumpBuf中读取记录然后发送出去

 

 

三个重要的位置

 

Head:队列头,datapump最新写到的位置
Tail:队列尾,可读的起始位置
Border:可读边界,完整的记录边界,读者可以读到的范围为tailborder之间的数据,head为最新写的位置,但是可能不是一条完整的记录,写入完整记录后需要将border设置为head使其可读
 
 

 

SharedQueue的生产和消费

 

 

RemoteSubplan重分布函数调用流程

上层执行节点:

 

下层执行节点:

上下层节点交互关系如下:

 

文章来自个人专栏
teledbx数据库
2 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0