Spark 广播join 与 Hive map join

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark 广播join 与 Hive map join相关的知识,希望对你有一定的参考价值。

参考技术A Sprak 广播变量

广播变量(Broadcast Variables)允许开发人员在每个节点(Worker or Executor)缓存只读变量,而不是在Task之间传递这些变量。调用sc.broadcast(v)创建一个广播变量,该广播变量的值封装在v变量中,可使用获取该变量value的方法进行访问。

原理 将小表的数据 广播到每个executor 所在的内存当中, 每个executor内可能有多个task,但是只存在一个小表的数据

Hive 对 大表和小表join的优化 就会走Map join
每个block 就是一个task任务
原理 将小表数据 先读到每个task 任务所在的内存当中,有几个task 就有几个 bkl

Spark的Join连接

Broadcast Join

适合情况,小表和大表,小表非常小,适合传播到各个节点。

当大表小表连接时,为了避免Shuffle,我们可以将小表广播到各个节点内存,供大表连接。一定程度上牺牲了空间,避免了Shuffle。这种Join在Spark中称作Broadcast Join。(需要注意的点是广播的只能是小表)

Shuffle Hash Join

适合情况,大表和小表,小表数据量增大,广播消耗资源大,按照join key进行分区,key相同分区也一定相同。大表分区,最后将两个表的数据进行hash join。

对两张表分别按照join keys进行重分区,即shuffle,目的是为了让有相同join keys值的记录分到对应的分区中。对对应分区中的数据进行join,此处先将小表分区构造为一张hash表,然后根据大表分区中记录的join keys值拿出来进行匹配。

  1. 确定Build Table和Probe Table。
  2. 构建HashTable 依次读取小表的join key进行hash,生成的哈希表缓存在内存中。
  3. 扫描大表,将相同join key的数据连接起来。

Broadcast Join和Shuffle Hash Join都是HashJoin。只不过在hash join之前需要先shuffle还是先broadcast。

Sort-Merge Join

适合情况,大表和大表。

共有三步:

  1. shuffle阶段:将两张大表根据join key进行重新分区,两张表数据会分布到整个集群,以便分布式并行处理
  2. sort阶段:对单个分区节点的两表数据,分别进行排序
  3. merge阶段:对排好序的两张分区表数据执行join操作。join操作很简单,分别遍历两个有序序列,碰到相同join key就merge输出,否则取更小一边

数据仓库设计时最好避免大表与大表的join查询

以上是关于Spark 广播join 与 Hive map join的主要内容,如果未能解决你的问题,请参考以下文章

Spark调优Broadcast广播变量

hive与mysql两种数据源之间的join

spark的join和sql的join的区别

Spark中对大表子查询加limit为什么会报Broadcast超时错误

怎么知道任务开始mapjoin

Spark的Join连接