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,广播变量都充当了减少数据传输,加速计算的角色。利用好广播变量,可以使程序变得更加灵活。
四、扩展阅读:怎么使用广播变量。
参考资料
知识共享
除非另有注明,本《Spark 性能优化》系列文章使用 CC BY-NC(署名-非商业性使用) 知识共享许可协议。