sparksql优化之浅谈mapjoin和broacast广播变量

2022年10月10日,在大数据集群跑任务,爆出超时错误,在同事建议下,增大broadcast join时长重跑程序。

Caused by: java.util.concurrent.TimeoutException: Futures timed out after [300 seconds]
    at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:223)
    at scala.concurrent.impl.Promise$DefaultPromise.result(Promise.scala:227)
    at org.apache.spark.util.ThreadUtils$.awaitResult(ThreadUtils.scala:220)
    at org.apache.spark.sql.execution.exchange.BroadcastExchangeExec.doExecuteBroadcast(BroadcastExchangeExec.scala:146)

 在等待期间,突然就有个疑问,这个broadcast不是广播变量吗,为什么这里会出现这个问题。代码中有倒是有加mapjoin优化,莫非spark on hive层面的mapjoin其实就是spark的广播变量?

 

1.mapjoin定义:mapjoin会把小表全部加载到内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map端是进行了join操作,省去了reduce运行的时间,算是hive中的一种优化。

2.所以这里的内存应该指的就是executor了,每个executor保存一份小表副本,再由executor下的task进行拉取,这里基本就是广播变量的原理了。

总结:1.优化场景:sql 场景小表需要left join大表,默认25m即是小表 2.使用方法:

select /*+ MAPJOIN(s) */ name,score from bigtable b join smalltable s

tips:RDD不可作为广播变量进行广播,为什么呢,下一篇见。 

                                 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值