Presto之BroadCast Join的实现

news/2024/11/29 13:44:19/

一. 前言

       在Presto中,Join的类型主要分成Partitioned Join和Broadcast Join,在Presto 之Hash Join的Partition_王飞活的博客-CSDN博客 中已经介绍了Presto的Partitioned Join的实现过程,本文主要介绍Broadcast Join的实现。

二. Presto中Broadcast Join的实现

     Broadcast的实现的过程如下:

  1. Presto首先在上游Stage扫描到的小表数据全部广播到各个Presto中的所有Worker。

  2. 然后Presto会将大表分拆成多个Split分发到所有的Worker并行执行。

  3. 各个Worker扫描到大表的数据后,仅需要将自己扫描到的大表数据与小表进行Join碰撞,产生各个Worker独立的Join结果。

  4. 各个Worker独立Join结果的汇总则为整个Join的结果,数据既不会重复,也不会丢失。

三. Presto中小表广播的实现

     与Partitioned Join相比,Broadcast的实现区别主要是在小表广播部分,后边的数据碰撞过程是一样的。在Presto中,所谓的广播,其实是所有worker中通过Exchange到上游的Stage数据,但是上游的Stage给各个Worker中都返回相同的数据,从而实现数据的广播而已。

       但是我们知道,上游Stage其实给每个Worker分配的Buffer地址是不一样的,比如worker1的buffer为buffers[0], worker1对应的buffer地址为buffers[1]......依次类推,在Presto中是怎么实现将所有worker的buffer数据完全的拷贝复制的呢?

       其实这主要依赖于在上游的Stage中使用了BroadcastOutputBuffer来实现的。在BroadcastOutputBuffer中,所有worker对应的buffer组合成一个buffer的List,BroadcastOutputBuffer中有数据进来时,在List中所有的buffer都add一遍。其主要的核心代码如下所示:

   1. 如果对应的worker的buffer还没初始化,那么add进来的数据先在initialPagesForNewBuffers中保存。

    2. 等下游的worker第一次过来拉取数据的时候,先初始化对应worker的buffer,并将initialPagesForNewBuffers中的数据放到buffer中去并返回给下游的worker。

    3. 下游的worker的buffer初始化完成后,在BroadcastOutputBuffer中,如果后续再有数据进来, BroadcastOutputBuffer会在各个worker的buffer中都add一份,实现数据的复制,主要代码如下所示:  

   

      4. 上述2和3使得下游不同的worker到上游的Stage拉取数据的时候,都是一样的数据,且都是完整的数据,因此实现了数据广播的功能。


http://www.ppmy.cn/news/95981.html

相关文章

RabbitMQ系列(24)--RabbitMQ集群搭建

前言:当RabbitMQ服务器遇到内存崩溃、机器掉电或者主板故障等情况,该怎么办?单台RabbitMQ服务器可以满足每秒1000条消息的吞吐量,那如果应用需要RabbitMQ服务满足每秒10万条消息的吞吐量呢?购买昂贵的服务器来增强单机RabbitMQ服务的性能不…

软考初级程序员上午单选题(20)

36、Windows系统的任务栏不可能出现在屏幕的______。 A.左边 B.右边 C.上边 D.中间 37、下列关于“快捷方式”的叙述中,不正确的是______。 A.可以使用快捷方式作为打开程序的捷径 B.快捷方式的…

递归--打印一个字符串的全部排列(java)

打印一个字符串的全部排列 打印一个字符串的全部排列解题思路打印一个字符串的全部排列,要求不要出现重复的排列递归专题 打印一个字符串的全部排列 自负串全排序: 举例: abc 的全排序是: abc acb bac bca cba cab 解题思路 因为每个字符都要选,其实就是选择每个字符…

程序猿成长之路番外篇-如何理解牛顿迭代法及如何使用牛顿迭代法求数的平方根

小伙伴们好久不见,我又来了,这次我分享的内容是如何理解牛顿迭代法及如何使用牛顿迭代法求数的平方根 什么是牛顿迭代法? 官方话术:牛顿迭代法又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson m…

Linux运维:网络管理

提前看:本文是Linux运维的学习笔记,之前的Linux命令基础和shell基础,使我们对Linux有系统的认识,但是这个方面的知识点非常多,今天啥也不干,就整理Linux运维各种范围出现的名词性内容进行解释。 一.补充知…

JavaEE进阶(5/27)Spring Boot

目录 1.认识Spring Boot 2.Spring Boot的优点 3.SpringBoot项目创建 4.resource文件夹 和test文件夹 5.使用一个Spring Boot项目 1.认识Spring Boot Spring Boot 中的Boot 是启动引导的意思 如果Spring相比于普通java开发是从走演变到了汽车,那么Spring boot 相比…

Linux 系统烧写

目录 MfgTool 工具简介MfgTool 工作原理简介烧写方式系统烧写原理 烧写NXP 官方系统烧写自制的系统系统烧写网络开机自启动设置 改造我们自己的烧写工具改造MfgTool烧写测试解决Linux 内核启动失败 前面我们已经移植好了uboot 和linux kernle,制作好了根文件系统。但…

数据结构 --- 树

1、二叉树 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 每个结点最多有两棵子树,即二叉…