Spark广播变量之超大表left join小表时如何进行优化以及小表的正确位置

Spark广播变量之大表left join小表时如何进行优化以及小表的正确位置放置,带着这个目标我们一探究竟。

项目场景:

最近工作中遇到一个场景:
有一个超大表3.5T和一个小表963K
需要做关联查询,使用到广播变量,广播小表数据,left join后接小表。
领提出优化,说小表在左left join可以执行效率,我提出了反对意见,为了验证领导所说的对与错,专门进行了测试


问题描述:

首先使用一个300M的表和10k的表进行测试, left join 将小表在右进行广播

sparkSQL-执行计划如下:

在这里插入图片描述
可以看出是BroadcastHashJoin,
使用这个 Join 策略必须满足以下条件:
•小表的数据必须很小,可以通过 spark.sql.autoBroadcastJoinThreshold 参数来配置,默认是 10MB,如果你的内存比较大,可以将这个阈值适当加大;如果将 spark.sql.autoBroadcastJoinThreshold 参数设置为 -1,可以关闭 BHJ;
•只能用于等值 Join,不要求参与 Join 的 keys 可排序;
•除了 full outer joins ,支持所有的 Join 类型。
物理计划如下:
在这里插入图片描述

下面进行 left join,把小表放在左侧进行广播测试
在这里插入图片描述
执行计划是没有广播数据,而是进行了SortMergeJoin,也是对两张表参与 Join 的 Keys 使用相同的分区算法和分区数进行分区,目的就是保证相同的 Keys 都落到相同的分区里面,分区完之后再对每个分区按照参与 Join 的 Keys 进行排序,最后 Reduce 端获取两张表相同分区的数据进行 Merge Join
里面使用了 SortMergeJoin,物理计划如下
在这里插入图片描述


原因分析:

Broadcast Hash Join 的实现是将小表的数据广播(broadcast)到 Spark 所有的 Executor 端,这个广播过程和我们自己去广播数据没什么区别,先利用 collect 算子将小表的数据从 Executor 端拉到 Driver 端,然后在 Driver 端调用 sparkContext.broadcast 广播到所有 Executor 端;然后在 Executor 端这个广播出去的小表数据会和大表进行 Join 操作,这种 Join 策略避免了 Shuffle 操作。一般而言,使用left join时会将广播后的表放在右侧


  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
以下是一些可能有助于优化大表left join小表的技巧: 1. 使用Broadcast Join:如果小表足够小,可以使用Broadcast Join小表复制到每个executor的内存中,这样可以避免Shuffle操作,提高查询速度。在Spark SQL中,可以使用broadcast()函数将小表标记为广播。 2. 增加shuffle分区数:如果大表小表分布不均匀,可以通过增加shuffle分区数来使数据更均匀地分布在各个executor中,从而提高查询速度。可以使用以下配置参数来增加shuffle分区数: spark.sql.shuffle.partitions 3. 优化Join条件:尽量避免使用非等值Join条件,因为这会导致Spark SQL进行笛卡尔积操作,导致性能下降。如果存在非等值Join条件,可以考虑将它们转换为等值Join条件。 4. 使用Bucketing:如果大表小表具有相同的Join键,并且它们都使用相同的Bucketing列进行桶分区,则可以使用Bucketing Join来加速查询。Bucketing Join可以避免Shuffle操作,因为Spark SQL可以将具有相同Bucketing键的行分配给相同的executor。 5. 使用索引:如果小表具有索引,可以使用Spark SQL的Index Join功能来加速查询。Index Join可以通过使用小表的索引来快速查找需要的行。 6. 调整硬件资源:如果查询仍然很慢,可以考虑增加executor的数量或调整executor的内存和CPU资源。可以使用以下配置参数来调整硬件资源: spark.executor.instances spark.executor.memory spark.executor.cores

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据学习僧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值