其他分享
首页 > 其他分享> > join分析:shuffle hash join、broadcast hash join

join分析:shuffle hash join、broadcast hash join

作者:互联网

Join 背景介绍


 Join 是数据库查询永远绕不开的话题,传统查询 SQL 技术总体可以分为简单操作(过滤操作、排序操作 等),聚合操作-groupby 以及 Join 操作等。其中 Join 操作是最复杂、代价最大的操作类型,也是 OLAP 场景中使用相对较多的操作。

另外,从业务层面来讲,用户在数仓建设的时候也会涉及 Join 使用的问题。通常情况下,数据仓库中的表一般会分为“低层次表”和“高层次表”。

为了获得时效性更高的查询结果,大多数场景都需要进行复杂的 Join 操作。Join 操作之所以复杂,主要是通常情况下其时间空间复杂度高,且有很多算法,在不同场景下需要选择特定算法才能获得最好的优化效果。

本文将介绍 SparkSQL 所支持的几种常见的 Join 算法及其适用场景。

 

基本实现机制


shuffle hash join、broadcast hash join 两者归根到底都属于 hash join,只不过在 hash join 之前需要先 shuffle 还是先 broadcast。其实,hash join 算法来自于传统数据库,而 shuffle 和 broadcast 是大数据的皮(分布式),两者一结合就成了大数据的算法了。因此可以说,大数据的根就是传统数据库。既然 hash join 是“内核”,那就刨出来看看,看完把“皮”再分析一下。

1、hash join

先来看看这样一条 SQL 语句:

很简单一个 Join 节点,参与 join 的两张表是 item 和 order,join key 分别是 item.id 以及 order.i_id。现在假设这个 Join 采用的是 hash join 算法,整个过程会经历三步:

 

分步解释:

 

基本流程可以参考上图,这里有两个小问题需要关注:

1. hash join 性能如何?

2. 为什么 Build Table 选择小表?

上文说过,hash join 是传统数据库中的单机 join 算法,在分布式环境下需要经过一定的分布式改造,就是尽可能利用分布式计算资源进行并行化计算,提高总体效率。hash join 分布式改造一般有两种经典方案:

1.broadcast hash join

2. shuffler hash join

 

broadcast hash join


如下图所示,broadcast hash join 可以分为两步:

 

分步解释:

 

1.broadcast 阶段:

2. hash join 阶段:

SparkSQL 规定 broadcast hash join 执行的基本条件为被广播小表必须小于参数  spark.sql.autoBroadcastJoinThreshold,默认为 10M。 

 

shuffle hash join


 

在大数据条件下如果一张表很小,执行 join 操作最优的选择无疑是 broadcast hash join,效率最高。但是一旦小表数据量增大,广播所需内存、带宽等资源必然就会太大,broadcast hash join 就不再是最优方案。此时可以按照 join key 进行分区,根据 key 相同必然分区相同的原理,就可以将大表 join 分而治之,划分为很多小表的 join,充分利用集群资源并行化。如下图所示

 

shuffle hash join 也可以分为两步:

 

1.shuffle 阶段:

2. hash join 阶段:

看到这里,可以初步总结出来如果两张小表 join 可以直接使用单机版 hash join;如果一张大表 join 一张极小表,可以选择 broadcast hash join 算法;而如果是一张大表 join 一张小表,则可以选择 shuffle hash join 算法;那如果是两张大表进行 join 呢?

 

sort merge join


 

SparkSQL 对两张大表 join 采用了全新的算法-sort-merge join,如下图所示

 

整个过程分为三个步骤:

 

1. shuffle 阶段:

2. sort 阶段:

3. merge 阶段:

 

经过上文的分析,很明显可以得出来这几种 Join 的代价关系:cost(broadcast hash join) < cost(shuffle hash join) < cost(sort merge join),数据仓库设计时最好避免大表与大表的 join 查询,SparkSQL 也可以根据内存资源、带宽资源适量将参数 spark.sql.autoBroadcastJoinThreshold 调大,让更多 join 实际执行为 broadcast hash join。 

 

 

参考资料


标签:hash,shuffle,broadcast,Join,Table,join,大表
来源: https://www.cnblogs.com/tgzhu/p/15211820.html