流式计算

spark性能优化一:系统级优化

2018-10-17  本文已影响0人  雪飘千里

1、概览

Spark计算本质是基于内存的,所以Spark程序的性能可能因为集群中的任何因素出现瓶颈:CPU、网络带宽、或者是内存;如果内存能够容纳得下所有数据,那么网络传输和通信就会导致性能出现瓶颈;但是如果内存比较紧张,不足以放下都有的数据(比如在针对10亿以上的数据量进行计算时),还是需要对内存的使用进行性能优化的,比如说使用一下手段来减少内存的消耗。

Spark性能优化,其实主要就是在于对内存的使用进行调优;
因为通常情况下,如果Spark应用程序计算的数据量比较小,并且内存足够用,那么只要运维保障网络正常,一般是不会有大的性能问题的;但是Spark应用程序的性能问题往往是针对大数据量(10亿级别)进行计算时出现,因此通常来说,Spark性能优化,主要是针对内存进行性能优化;当然除了内存调优外,还有别的可以调。

2、分配更多资源

性能调优的王道,其实就是增加更多的资源,基本上,在一定范围内,增加资源与性能的提升是成正比的;当我们写完一个复杂的Spark应用后,第一步,就是要调节最优的资源配置,当公司的资源达到了自己能利用的顶端后,才需要考虑下面这些优化技术。

下面来讨论下怎么分配更多资源

/usr/local/spark/bin/spark-submit \
--class cn.spark.sparktest.core.WordCountCluster \
--num-executors 3 \  配置executor的数量
--driver-memory 100m \  配置driver的内存(影响不大)
--executor-memory 100m \  配置每个executor的内存大小
--executor-cores 3 \  配置每个executor的cpu core数量
/usr/local/SparkTest-0.0.1-SNAPSHOT-jar-with-dependencies.jar \
image.png

3、提高并行度

分配了更多资源以后,还需要充分的利用,所以要尽量设置合理的并行度,来充分利用集群的资源,从而提高Spark应用程序的性能。

那么,Spark并行度指的是什么?
Spark作业中,Application,jobs,action(collect)操作会触发一个job;每个job会拆成多个stage,啥时候拆分呢?是在发生shuffle(reduceByKey)的时候,会拆分出一个stage。详细过程见前面写过的stage划分算法
其实,spark并行度指的是Spark作业中,各个阶段(stage)的task数量;

image.png

4、优化技术

通常情况下,当资源和并行度都合理设置好以后,spark作业就很快了,可能几分钟就跑完了。这时候如果还需要优化,那就是优化spark作业代码了。

关于优化这里说明一下,每个优化技术重要性并不是一样的,起的作用也不是一样的,这点一定要分清。对于性能来说,打个比方,我们要做一桌菜,最重要的是主菜,那么对于优化来说,分配资源,并行度设置,RDD架构和持久化就是三道主菜;shuffle调优、groupByKey用ruduceByKey改写、数据本地化,就是配菜,虽然没有主菜那么重要,但是也是必不可少的;至于broadcast、kryo、fastutil,就是一些特殊的调料,有的话更好吃,但是没有的话,也不会影响特别大。所以优化的过程中,一定要把握到优化的技术点,不要在不重要的点上花费太多的时间。

直观一点,假如我们的spark作业,在没有经过调优的时候,大概30分钟运行完成,
现在如果我们能申请到更多的资源(资源更大的Yarn队列),可能3分钟就可以完成;
如果我们shuffle调优,groupByKey用redueceBykey改写,数据本地聚合,可能15分钟可以完成;
如果我们broadcast、kryo、fastutil、jvm调优,可能25分钟可以完成;
从这里就可以看出,我们优化时的顺序。

5、诊断内存消耗

上一篇下一篇

猜你喜欢

热点阅读