spark join broadcast优化

387 阅读1分钟

\

目录(?)[-]

  1. 举例
  2. 样本数据2000w性能测试对比
  3. 实现代码spark15

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

举例

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

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

这里写图片描述

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

这里写图片描述

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

小表没有进行broadcast

无广播

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

这里写图片描述

实现代码(spark1.5)

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">//读取ip表
val df = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>

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

//注册表
df.registerTempTable(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"ipTable"</span>)

//关联
sqlContext.sql(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"select * from (select * from ipTable)a join (select * from hist)b on a.ip = b.ip"</span>)

......
</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>

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

spark.sql.autoBroadcastJoinThreshold