spark join broadcast优化

在大量数据中对一些字段进行关联。

举例

ipTable:需要进行关联的几千条ip数据(70k) 
hist:历史数据(百亿级别)

直接join将会对所有数据进行shuffle,需要大量的io操作,相同的key会在同一个partition中进行处理,任务的并发度也收到了限制。

这里写图片描述

使用broadcast将会把小表分发到每台执行节点上,因此,关联操作都在本地完成,基本就取消了shuffle的过程,运行效率大幅度提高。

这里写图片描述

样本数据(2000w)性能测试对比

小表没有进行broadcast

无广播

进行了broadcast,可以看到连shuffle过程都省略了

这里写图片描述

实现代码(spark1.5)

//读取ip表
val df = ...

//如果数据小于设定的广播大小则将该表广播,默认10M
df.cache.count

//注册表
df.registerTempTable("ipTable")

//关联
sqlContext.sql("select * from (select * from ipTable)a join (select * from hist)b on a.ip = b.ip")

......
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

设置表广播的阈值,如果有需求且内存足够,可以将该值提高,默认10M

spark.sql.autoBroadcastJoinThreshold

阅读更多

扫码向博主提问

菜鸟级的IT之路

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • Hadoop
  • Spark
  • Java后端
  • HBase
去开通我的Chat快问
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页