Spark项目实战-实际项目中常见的优化点-广播大变量

首先我们从这篇博客简单了解下Spark中的共享变量。然后我们在这里举个简单例子更加深入的了解一下为什么需要广播大变量。

假设,我们现在有一个外部变量A(大小10M),然后有三个Task都需要用到变量A。

在这种默认的,task执行的算子中使用了外部的变量,每个task都会获取一份变量的副本,通俗点说就是每个task中都会有一个变量A,那么3个task并行执行的时候就会占掉30M内存。

这种情况有什么缺点呢?可能这里举的例子3个task的数量级我们感觉不是很深刻。那么假设我们的资源给的到位,配合着资源,并行度调节的绝对到位,总共1000个task。那么这1000个task同时并行执行,那么首先变量A会拷贝1000份副本,通过网络传输到各个task中去给task使用。总计有10000M的数据会通过网络传输。10000M的数据在网络上传输,这种情况可想有多糟糕。暂且不说网络传输的过程还要消耗掉spark作业运行的总时间的一小部分。变量A传输到了各个task上之后,是要占用内存的。1个变量A的确不大,但是1000个变量A分布在集群中,一下子就耗费掉10000M的内存。不必要的内存的消耗和占用,就导致了,你在进行RDD持久化到内存,也许就没法完全在内存中放下。就只能写入磁盘,最后导致后续的操作在磁盘IO上消耗性能。你的task在创建对象的时候,也许会发现堆内存放不下所有对象,也许就会导致频繁的垃圾回收器的回收,GC。GC的时候,一定是会导致工作线程停止,也就是导致Spark暂停工作那么一点时间。频繁GC的话,对Spark作业的运行的速度会有相当可观的影响。 

那么如果我们使用广播变量又是什么情况呢?

对变量A进行广播之后,只有在Executor的第一个task运行时才会从Driver中拉去一个变量A的副本,此时变量A已经保存到Executor的BlockManager中,那么后续在该Executor运行的task都可以直接从BlockManager中读取变量A。相对于没有使用广播变量,对性能的提升和影响,还是很客观的。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值