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

2021年7月9日 7点热度 0条评论 来源: 唐予之_

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自定义累加器的使用

    原文作者:唐予之_
    原文地址: https://blog.csdn.net/lxhandlbb/article/details/52987839
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。