SparkSql中join和shuffle知识点梳理

sparksql中有一些容易混淆的概念,大家在面试时也会经常被问到join和shuffle相关的问题:

  • 说说join的几种实现

  • 说说shuffle的实现

  • join操作一定发生shuffle吗?

  • spark shuffle 2.0以上已经不用hash shuffle了,那join的时候还用hash join 么?

  • ...

想要弄清楚这些,就得搞清楚sparksql中join的具体实现有哪些?shuffle又有哪些?他们之间的关系又是什么?

sparksql中的join

BaseJoinExec是sparksql中join实现的基类。

1a841a33a5b35e6b62efd4aaab75d60a.jpeg

sparksql中,join有六种实现方式:

  • SortMergeJoinExec

  • ShuffledHashJoinExec

  • BroadcastHashJoinExec

  • BroadcastNestedLoopJoinExec

  • CartesianProductExec

具体特点及分发类型如下图:bb02d8886e71c5da3e7bba4a75b2cc60.png

sparksql中的shuffle

Exchange

如果某个sql会发生shuffle,那么它的执行计划中一定会出现Exchange(实际是ShuffleExchangeExec)节点。

Exchange的两个实现类:

BroadcastExchangeExec(广播)、ShuffleExchangeExec(shuffle)

27ee017831ec710a0ad8d353677701c9.png

BroadcastExchangeExec:对应sql中的广播相关的join。

ShuffleExchangeExec:对应sql中shuffle hash join、sort merge join或者聚合类的操作,比如group by,grouping sets。

Shuffle机制

所谓shuffle就是把不同节点上的数据按相同key值拉取到一个节点上。

shuffle发生在map 和reduce之间(也可以说是两个stage之间),分为shuffleWrite 和shuffleRead两个过程。

shuffle 过程:

前一个stage进行shuffle write 把数据存在blockManage;

下一个stage 进行shuffle read 拉取上个stage 的数据。

几个重要的类:

shuffleManager

13283871392d8d8ab82a2b9754200c37.png

ShuffleManager是Spark系统中可插拔的Shuffle系统接口,ShuffleManager会在Driver或Executor的SparkEnv被创建时一并创建,可以通过spark.shuffle.manage配置指定具体的实现类。目前唯一实现类org.apache.spark.shuffle.sort.SortShuffleManager

ShuffleWriter

9e27bb92907b99b27e08f7960097e87d.png

ShuffleWriter是Spark提供的ShuffleMapTask写入数据的主要类,有三种writer,分别是BypassMergeSortShuffleWriter,UnsafeShuffleWriter和SortShuffleWriter。

ShuffleManager通过getWriter方法获取合适的ShuffleWriter,然后通过write方法写入数据到存储系统中。

b4da765dae4488496f8732f5002f3bbc.png


ShuffleReader

25ecc52542b0ee77b99c3105f77665d4.png

ShuffleReader是Shuffle read任务从上游ShuffleMapTask的结果MapStatus获取文件信息,读取数据产生迭代器,是后续Task使用的源数据的生产者,目前唯一实现是BlockStoreShuffleReader,实现了read方法。

总结

  • join操作一定发生shuffle吗?

不一定。只有 SortMergeJoinExec 和 ShuffledHashJoinExec  这两种类型的join实现会发生shuffle;如果再拓展一下的话,可以说一下这几种join的选择策略(相关源码咱们课上见)。

  • spark shuffle 2.0以上已经不用hash shuffle了,那join的时候还用hash join 么?

shuffle是一种数据分发的方式,它的实现代表的是两个stage之间的数据按照什么方式移动;而join是发生在某个stage中,hash join是指把小表构建成hash表,和基表进关联的操作。

hash shuffle被弃用了,hash join在ShuffledHashJoinExec 和  BroadcastHashJoinExec这两种join的实现中还在使用。

5d02c0db4c03530e091dd3ad17bcf86d.png

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值