Spark调优--性能调优

前天跟大家聊spark优化,说了个大体上的方案,今天就性能调优跟大家聊聊,首先分如下4块

一>  分配更多资源

分配哪些资源?

Executor的数量,每个executor所能分配的cpu数量,内存量,driver分配的内存量

在哪里分配呢?

在开发中,提交spark作业时,用的是spark-submit shell脚本,里面调整对应的参数

为什么得到这些资源以后,性能会得到提升?

 I  如果需要对RDD进行cache,增加了内存,那么可以缓存更多的数据,将更少的数据写入磁盘,甚至不写入磁盘,减少了IO操作

II  对于shuffle操作,reduce端在拉去数据进行聚合的时候,入股内存不够,数据会写到磁盘,reduce就回去磁盘拉去,增加了IO操作,反之,内存相对大点,可以直接去内存拉,增加速度了

III  对于task的执行,可能会创建很多对象,如果内存比较小可能会频繁导致JVM堆内存满了,频繁垃圾回收,增大内存,速度会变快

一>  调节并行度

比如说有50个节点(executor),每个节点有3个core,那么集群开启可以一次跑150个task,如果不设置task数量,比如现在100个task开始跑的时候会白白浪费1/3的executor所以,要合理调节task跟core的数量    

设置core跟Tast的数量    官方是推荐,task数量,设置成spark application总cpu core数量的2~3倍,比如150个cpu core,基本要设置task数量为300~500。

一>  RDD持久化

将数据持久化到内存,下次直接到内存取数据,更快

一>  广播变量

         在我们提交作业的时候,需要传递到executor上的task去运行,对于一些固定的数据每次都需要Driver广播到task上,效率低,广播变量允许将变量广播到executor上的BlockManager,这样以后每个Task获取变量的时候可以直接在本地的BlockManager上获取变量了

猜你喜欢

转载自blog.csdn.net/qq_32736999/article/details/83959859