Spark SQL五大关联策略

京东云开发者
• 阅读 177

1、五种连接策略

选择连接策略的核心原则是尽量避免shuffle和sort的操作,因为这些操作性能开销很大,比较吃资源且耗时,所以首选的连接策略是不需要shuffle和sort的hash连接策略。

◦Broadcast Hash Join(BHJ):广播散列连接

◦Shuffle Hash Join(SHJ):洗牌散列连接

◦Shuffle Sort Merge Join(SMJ):洗牌排列合并联系

◦Cartesian Product Join(CPJ):笛卡尔积连接

◦Broadcast Nested Loop Join(BNLJ):广播嵌套循环连接

2、连接影响因素

2.1、连接类型是否为equi-join(等值连接)

等值连接是指一个连接条件中只包含“=”比较的连接,而非等值连接包含除“=”以外的任何比较,如“<、>、>=、<=”,由于非等值连接是对不确定值的范围比较,需要嵌套循环,所以只有CPJ和BMLJ两种连接策略支持非等值连接,对于等值连接,所有连接策略都支持。

2.2、连接策略提示(**Join strategy hint**)

Spark SQL为开发人员提供了通过连接提示对连接策略选择进行一些控制,共支持4种连接提示(Spark3.0.0版本)。

▪BROADCAST

▪SHUFFLE_MERGE

▪SHUFFLE_HASH

▪SHUFFLE_REPLICATE_NL

使用示例:SELECT

/*+ BROADCAST(table_B) */ *

FROM

table_A

INNER JOIN

table_B

ON

table_A.id = table_B.id

2.3、连接数据集的大小(Size of Join relations)

选择连接策略最重要的因素是连接数据集的大小,是否可以选择不需要shuffle和sort的基于hash的连接策略,就取决于连接中涉及的数据集的大小。

3、连接策略优先级

Spark SQL五大关联策略

4、五种连接策略运行原理

4.1、Broadcast Hash Join(BHJ):广播散列连接

主要分为两个阶段:

1.广播阶段:通过collect算子将小表数据拉到Driver端,再把整体的小表广播致每个Executor端一份。

2.关联阶段:在每个Executor上进行hash join,为较小的表通过join key创建hashedRelation作为build table,循环大表stream table通过join key关联build table。

限制条件:

1.被广播的小表大小必须小于参数:spark.sql.autoBroadcaseJoinThreshold,默认为10M。

2.基表不能被广播,比如left join时,只能广播右表。

3.数据集的总行数小于MAX_BROADCAST_TABLE_ROWS阈值,阈值被设置为3.41亿行。

Spark SQL五大关联策略

4.2、**Shuffle Hash Join(SHJ):洗牌散列连接**

主要分为两个阶段:

1.洗牌阶段:通过对两张表分别按照join key分区洗牌,为了让相同join key的数据分配到同一Executor中。

2.关联阶段:在每个Executor上进行hash join,为较小的表通过join key创建hashedRelation作为build table,循环大表stream table通过join key关联build table。

限制条件:

1.小表大小必须小于参数:spark.sql.autoBroadcaseJoinThreshold(默认为10M) * shuffle分区数。

2.基表不能被广播,比如left join时,只能广播右表。

3.较小表至少比较大表小3倍以上,否则性能收益未必大于Shuffle Sort Merge Join。

Spark SQL五大关联策略

4.3、Shuffle Sort Merge Join(SMJ):洗牌排列合并联系

主要分为两个阶段:

1.洗牌阶段:将两张大表分别按照join key分区洗牌,为了让相同join key的数据分配到同一分区中。

2.排序阶段:对单个分区的两张表分别进行升序排序。

3.关联阶段:两张有序表都可以作为stream table或build table,顺序迭代stream table行,在build table顺序逐行搜索,相同键关联,由于stream table或build table都是按连接键排序的,当连接过程转移到下一个stream table行时,在build table中不必从第一个行搜索,只需从与最后一个stream table匹配行继续搜索即可。

限制条件:

1.连接键必须是可排序的。

Spark SQL五大关联策略

4.4、Cartesian Product Join(CPJ):笛卡尔积连接

主要分为两个阶段:

1.分区阶段:将两张大表分别进行分片,再将两个父分片a,b进行笛卡尔积组装子分片,子分片数量:a*b。

2.关联阶段:会对stream table和build table两个表使用内、外两个嵌套的for循环依次扫描,通过关联键进行关联。

限制条件:

1.left join广播右表,right join广播左表,inner join广播两张表。

Spark SQL五大关联策略

4.5、Broadcast Nested Loop Join(BNLJ):广播嵌套循环连接

主要分为两个阶段:

1.广播阶段:通过collect算子将小表数据拉到Driver端,再把整体的小表广播致每个Executor端一份。

2.关联阶段:会对stream table和build table两个表使用内、外两个嵌套的for循环依次扫描,通过关联键进行关联。

限制条件:

1.仅支持内连接。

2.开启参数:spark.sql.crossJoin.enabled=true。

Spark SQL五大关联策略

作者:曲海龙

来源:京东云开发者社区 转载请注明来源

点赞
收藏
评论区
推荐文章
Stella981 Stella981
2年前
Spring Boot + Spring Cloud 实现权限管理系统 后端篇(七):集成 Druid 数据源
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。通过数据库连接池能明显提高对数据库操作的性能。在Java应用程序开发中,常用的连接池有DBCP、C3P0、Proxool等。SpringBoot默认提供
Stella981 Stella981
2年前
Spark Shuffle之Sort Shuffle
源文件放在github,随着理解的深入,不断更新,如有谬误之处,欢迎指正。原文链接https://github.com/jacksu/utils4s/blob/master/sparkknowledge/md/sortshuffle.md(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%
Stella981 Stella981
2年前
Spring Boot:集成Druid数据源
综合概述数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。通过数据库连接池能明显提高对数据库操作的性能。在Java应用程序开发中,常用的连接池有DBCP、C3P0、Proxool等。Spri
Stella981 Stella981
2年前
Hibernate4教程六:性能提升和二级缓存
抓取策略(fetchingstrategy)是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候,Hibernate如何获取关联对象的策略。抓取策略可以在O/R映射的元数据中声明,也可以在特定的HQL或条件查询(CriteriaQuery)中重载声明。Hibernate4定义了如下几种抓取策略:1:连接抓取(J
Stella981 Stella981
2年前
HikariCP
数据库连接池技术数据库连接池负责分配、管理和释放数据库的连接。1.数据库连接复用。重复使用现有的数据库连接,可以避免连接频繁建立、关闭的开销。2.统一的连接管理。释放空闲时间超过最大空闲时间的数据库连接,避免因为没有释放数据库连接而引起的数据库连接泄漏。HikariCP字节码精简:优化代码,直到编译后的字节码最少
Wesley13 Wesley13
2年前
Java虚拟机类加载机制
概述  虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。  与那些在编译时需要进行连接工作的语言不同,在Java语言里面,类型的加载、连接和初始化过程都在程序运行期间完成的,这种策略虽然会稍微增加一些系统性能开销,但是会为Java应用程序
Stella981 Stella981
2年前
Spring Cloud系列教程(十九)
一、前言在Ribbon组件中,一共提供了7种负载均衡策略规则,默认使用轮训规则RoundRobinRule:最低并发策略BestAvailableRule:选择最小请求数可用过滤策略(AvailabilityFilteringRule):过滤掉连接失败的服务节点,并且过滤掉高并发的服务
Wesley13 Wesley13
2年前
如何利用策略模式避免冗长的 if
策略模式。在实际的项目开发中,这个模式也比较常用。最常见的应用场景是,利用它来避免冗长的ifelse或switch分支判断。不过,它的作用还不止如此。它也可以像模板模式那样,提供框架的扩展点等等。对于策略模式。本篇我们讲解策略模式的原理和实现,以及如何用它来避免分支判断逻辑。后续我会通过一个具体的例子,来详细讲解策略模式的应用场景以及真正的设计意图
弹性数据库连接池探活策略调研(二)——Druid | 京东云技术团队
前言在中,我们介绍了弹性数据库连接失效的背景,并探讨了HikariCP连接池探活策略的相关内容。在本文中,我们将会继续探讨另一个线上常用的连接池——Druid,并为您介绍如何在使用Druid时实现最佳实践的弹性数据库连接池探活策略。DruidDruid的版
弹性数据库连接池探活策略调研(三)——DBCP | 京东云技术团队
在之前的文章中,我们介绍了弹性数据库连接失效的背景,并探讨了HikariCP、Druid连接池探活策略的相关内容。在本文中,我们将会继续探讨另一个线上常用的连接池——DBCP,并为您介绍如何在使用DBCP时实现最佳实践的弹性数据库连接池探活策略。