专栏名称: 王知无
大数据布道师
目录
相关文章推荐
跟宇宙结婚  ·  3月20日限定福利:上饿了么搜【跟宇宙结婚】 ... ·  9 小时前  
跟宇宙结婚  ·  【调研】“跟宇宙结婚”十周年线下活动参与意向 ·  9 小时前  
跟宇宙结婚  ·  看王影璐!|跟宇宙结婚 ·  昨天  
51好读  ›  专栏  ›  王知无

Spark难点 | Join的实现原理

王知无  · 掘金  ·  · 2019-11-17 07:00

正文

阅读 7

Spark难点 | Join的实现原理

Join背景

当前SparkSQL支持三种join算法:Shuffle Hash Join、Broadcast Hash Join以及Sort Merge Join。其中前两者归根到底都属于Hash Join,只不过载Hash Join之前需要先Shuffle还是先Broadcast。其实,Hash Join算法来自于传统数据库,而Shuffle和Broadcast是大数据在分布式情况下的概念,两者结合的产物。因此可以说,大数据的根就是传统数据库。Hash Join是内核。

Spark Join的分类和实现机制

file

上图是Spark Join的分类和使用。

Hash Join

先来看看这样一条SQL语句:select * from order,item where item.id = order.i_id,参与join的两张表是order和item,join key分别是item.id以及order.i_id。现在假设Join采用的是hash join算法,整个过程会经历三步:

  • 确定Build Table以及Probe Table:这个概念比较重要,Build Table会被构建成以join key为key的hash table,而Probe Table使用join key在这张hash table表中寻找符合条件的行,然后进行join链接。Build表和Probe表是Spark决定的。通常情况下,小表会被作为Build Table,较大的表会被作为Probe Table。
  • 构建Hash Table:依次读取Build Table(item)的数据,对于每一条数据根据Join Key(item.id)进行hash,hash到对应的bucket中(类似于HashMap的原理),最后会生成一张HashTable,HashTable会缓存在内存中,如果内存放不下会dump到磁盘中。
  • 匹配:生成Hash Table后,在依次扫描Probe Table(order)的数据,使用相同的hash函数(在spark中,实际上就是要使用相同的partitioner)在Hash Table中寻找hash(join key)相同的值,如果匹配成功就将两者join在一起。

file

Broadcast Hash Join

当Join的一张表很小的时候,使用broadcast hash join。

Broadcast Hash Join的条件有以下几个:

  • 被广播的表需要小于spark.sql.autoBroadcastJoinThreshold所配置的信息,默认是10M;
  • 基表不能被广播,比如left outer join时,只能广播右表。

file







请到「今天看啥」查看全文