Spark性能调优之——在实际项目中广播大变量

Spark性能调优之——在实际项目中广播大变量

为什么要用广播变量?

一、一个Spark Application

  • Driver进程

其实就是我们写的Spark作业,打成jar运行起来的主进程。

比如一个1M的map(随机抽取的map) ,创建1000个副本,网络传输!分到1000个机器上,则占用了1G内存。

不必要的网络消耗,和内存消耗。

二、会出现的恶劣情况:

如果你是从哪个表里面读取了一些维度数据,比方说,所有商品的品类的信息,在某个算子函数中使用到100M。

1000个task 。100G的数据,要进行网络传输,集群瞬间性能下降。

三、解决方案:

如果说,task使用大变量(1M-100M),明知道会导致大量消耗。该怎么做呢?

使用广播!!
  • 1.广播变量里面会在Driver有一份初始副本。

    一个executor 会对应一份blockManager!
    
  • 2.task在运行的时候,想要使用 广播变量中的数据,此时会首先在本地的Executor对应的BlockManager上 获取,如果没有。
    则:
    blockManager会Driver上拉取map(也有可能从距离比较近的其他节点的Executor的BlockManager上获取!这样效率更高)

四、使用广播变量的好处:

不是每个task一份副本,而是变成每个节点Executor上一个副本。

1.举例来说:

50个Executor 1000个task。 
一个map10M 

默认情况下,1000个task 1000个副本

1000 * 10M = 10 000M = 10 G

10G的数据,网络传输,在集群中,耗费10G的内存资源

如果使用 广播变量,

50个Executor ,50个副本,10M*50 = 500M的数据

网络传输,而且不一定是从Drver传输到各个节点,还可能是从就近的节点
的Executor的BlockManager上获取变量副本,网络传输速度大大增加。

之前 10000M 现在 500M

20倍网络传输性能的消耗。20倍内存消耗的减少。

虽然说,不一定会对性能产生决定向性的作用。比如运行30分钟的spark作业,可能做了广播变量以后,速度快了2分钟。变成28分钟。

2.实际效果

没有经过任何肉条有手段的spark作业,16个小时

三板斧下来(资源,并行度,RDD重构) ,就可以到5小时。

然后重要的一个调优,影响特别大,shuffle调优,2~3小时,应用了10个以上的性能调优技术点。

JVM调优+广播后,30分钟。

整体的调优效果: 16小时 变成 30分钟!!!!

怎么使用广播变量。

参考:

Spark广播和累加器的使用

Spark自定义累加器的使用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值