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

Posted by luoxuehuan on December 10, 2016

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

[数澜 Spark]性能调优系列,返回目录请猛戳这里

「数澜·大数据」技术团队荣誉出品

本文目录:

一、为什么要用广播变量?

[TOC]

一、为什么要用广播变量

1.一个Spark Application

Driver进程

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

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

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

2.会出现的恶劣情况:

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

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

3.解决方案:

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

使用广播变量:

  • 1.广播变量里面会在Driver有一份初始副本。一个executor 会对应一份blockManager!

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

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

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分钟!!!!

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

三、全文总结

无论是普通数据处理,还是在Spark SQL 中使用广播变量的方式进行Map Join,广播变量都充当了减少数据传输,加速计算的角色。利用好广播变量,可以使程序变得更加灵活。

四、扩展阅读:怎么使用广播变量。

  1. Spark广播和累加器的使用

  2. Spark自定义累加器的使用

参考资料

  1. Broadcast Variables

知识共享

除非另有注明,本《Spark 性能优化》系列文章使用 CC BY-NC(署名-非商业性使用) 知识共享许可协议。