写在前面的一些”废话“:
最近在做spark的项目,虽然项目基本功能都实现了,但是在真正的成产环境中去运行,发现程序运行效率异常缓慢;迫于无奈(实际是自己都不忍直视了),所以决定对程序做一番优化操作。在网上查看了不上关于spark程序的优化方法,但是都比较分散不够全面,所以决定就自己编写的基于Java的spark程序,记录一下我所做过的一些优化操作,加深印象方面以后的项目调优使用。这是一个Spark系列的优化操作,包括了很多方面,欢迎大家一块讨论学习。好了,废话好像有点多,下面开始进入正题:
关于spark最基本的优化就是尽量给spark作业分配尽量多的资源供spark程序使用,一般只有在拿不到更多的资源供spark作业使用的时候,才会去考虑在其他方面对spark作业进行优化(好像有点像废话)。那么本片文章中介绍的调优主要是几个在提交任务的时候设定的参数,在介绍本文的内容之前,首先提出几个问题:
问题一:有哪些资源可以分配给spark作业使用?
问题二:在什么地方分配资源给spark作业?
问题三:为什么分配了这些资源以后,我们的spark作业的性能就会得到提升呢?
接下来我们就围绕这三个问题展开讨论。
第一个问题:那些资源可以分配给spark作业?
答案:executor个数,cpu per exector(每个executor可使用的CPU个数),memory per exector(每个executor可使用的内存),driver memory
第二个问题:我们在什么地方分配这些资源?
答案:很简单,就是在我们提交spark作业的时候的脚本中设定,具体如下(这里以我的项目为例):
/usr/local/spark/bin/spark-submit \
--class com.xingyun.test.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 \
我们该如何设定这些参数的大小呢?下面分两种情况讨论。
case1:把spark作业提交到Spark Standalone上面。一般自己知道自己的spark测试集群的机器情况。举个例子:比如我们的测试集群的机器为每台4G内存,2个CPU core,5台机器。这里以可以申请到最大的资源为例,那么 --num-executors 参数就设定为 5,那么每个executor平均分配到的资源为:--executor-memory 参数设定为4G,--executor-cores 参数设定为 2 。
case2:把spark作业提交到Yarn集群上去。那就得去看看要提交的资源队列中大概还有多少资源可以背调度。举个例子:假如可调度的资源配置为:500G内存,100个CPU core,50台机器。 --num-executors 参数就设定为 50,那么每个executor平均分配到的资源为:--executor-memory 参数设定为 10G,--executor-cores 参数设定为 2
第三个问题:为什么分配了这些资源以后,我们的spark作业的性能就会得到提升呢?
首先,先来看一张图:
Spark程序启动的时候,SparkContext,DAGScheduler,TaskScheduler会将我们的RDD算子切割成一个个的Taskset(一系列的task任务),然后提交到Application的executor上面去执行。
基于此有如下两点说明:
第一:增加每个executor的cpu core,也是增加了执行的并行能力。假定原本20个executor,每个2个cpu core。能够并行执行的task数量,就是40个task。现在每个executor的cpu core,增加到了5个。能够并行执行的task数量,就是100个task。执行的速度,提升了2.5倍。增加Exector的道理也是一样的。第二:增加每个executor的内存量。
第二:增加了内存量以后,对性能的提升有两点。
1.如果需要对RDD产生的结果进行cache操作,那么内存越大,我们可以缓存的内容就越多,写入磁盘的数据就越少。从而减小了磁盘的IO。
2.对于task的执行,会创建很多的临时对象,这些对象全部都在内存中,如果内存比较小,可能会导致频繁的GC(minor GC,full GC),从而导致程序运行缓慢,将内存变大以后,会是的GC次数减少,从而提高了程序的运行速度。
本片文章到这里基本就完了,后面会不定期的更新关于spark调优的一些文章,希望可以一块讨论学习。欢迎关注。
如需转载,请注明: