首页 理论教育 资源参数调优:实现系统性能提升

资源参数调优:实现系统性能提升

时间:2023-06-29 理论教育 版权反馈
【摘要】:所谓Spark资源参数调优,其实主要就是对Spark程序运行过程中各个使用资源的地方,通过调节各种参数来优化资源使用的效率,从而提升Spark作业的执行性能。需要注意的是,资源参数的调优不是一劳永逸的,需要根据实际作业执行情况动态调整。资源参数的调优没有一个固定的值,随着参数和配置的变化,性能的瓶颈是变化的,这就需要根据自己的实际情况来动态调整配置。

资源参数调优:实现系统性能提升

所谓Spark资源参数调优,其实主要就是对Spark程序运行过程中各个使用资源的地方,通过调节各种参数来优化资源使用的效率,从而提升Spark作业的执行性能。需要考虑的资源主要是分配给各个Executors的Core的个数和内存,分配给程序的Executors总个数,以及分配的本地磁盘数等。

Spark应用程序的每个Executors都有固定的一样的Core和内存。

每个Executors的内存,在各种模式下,都可以通过Spark-Submit的-executor-memory参数,或spark-defaults.conf配置文件的spark.executor.memory参数来指定。Executors内存的大小很多时候直接决定了Spark作业的性能,而且跟常见的JVM OOM异常也有直接关联。但该值不是越大越好,因为太大的堆空间会引起GC垃圾回收的延迟,该堆大小的最大值建议不超过64 GB。

每个Executor的Core个数和申请的Executors的总个数,在YARN模式下,可以通过spark-submit的-executor-cores参数和-num-executors参数来分别指定,也可以通过spark-defaults.conf配置文件中的spark.executor.cores参数和spark.executor.instances参数来分别指定;在Standalone和Mesos模式下,由于Spark程序会尽可能多地占用所有可用的Core和创建尽可能多的Executors,所以可以通过参数spark.cores.max来指定程序申请的Ex-ecutors的Core总个数。因为每个CPU Core同一时间只能执行一个Task线程,所以每个Ex-ecutor进程的CPU Core数量越多,越能够快速地执行完分配给自己的所有的Task线程。但是还需要考虑到文件系统的I/O吞吐量,一个最佳实践是,建议为每个Executor设置5个或5个以下的Core。

Spark使用Executor的本地磁盘来存储Shuffle时的临时数据和Spill到磁盘上的被缓存的RDD分区,配置使用多个本地磁盘可以提升Spark的性能。在YARN模式下,YARN有自己的配置本地磁盘的机制;在Standalone模式下,可以在conf/spark-env.sh中配置环境变量SPARK_LOCAL_DIRS;在Mesos模式下,可以配置选项spark.local.dir.这3种配置模式都可以配置多个文件目录,多个文件目录之间需要用逗号隔开。(www.xing528.com)

由于每一台Host上面可以并行N个Worker,每一个Worker下面可以并行M个Execu-tor,每个Executor可以占用一个或多个Core,而Task会被分配到Executor上去执行且默认情况下一个Task占用一个Core,所以可以通过观察CPU的使用率变化来了解计算资源的使用情况。若CPU利用率很低且程序运行缓慢,就可以尝试减少每个Executor占用的cpu cores的数量,增加并行的Executors数量,同时配合增加数据分片,整体上增加CPU的利用率,加快数据处理速度;若Job很容易发生内存溢出,就可以尝试增大分片数量,从而减少每个数据分片的大小,同时减少并行的Executors的数量,这样相同的内存资源分配给数量更少的Executors,相当于增加了每个Task的内存分配,这样运行速度可能慢了些,但是总比OOM强;若数据量特别少,有大量的小文件生成,就可以尝试减少数据分片,没必要创建那么多的Task,其实这种情况如果只是最原始的输入文件比较小,一般都能被注意到,但是如果是在运算过程中,比如应用某个reduceByKey或者Filter后,数据大量减少,这种低效情况就很少被留意到,要特别注意。

当为Executors分配好内存后,也可以通过参数进一步控制内存如何使用,如内存的多少可以用来计算,内存的多少可以用来做持久化操作等,涉及的参数在Spark的不同版本中有所不同,Spark 1.6.0之前所使用的内存管理模式由类StaticMemoryManager实现,而Spark 1.6.0后所使用的内存管理模式由类UnifiedMemoryManager实现,进一步的调优细节请参考9.3.5内存调优。

需要注意的是,资源参数的调优不是一劳永逸的,需要根据实际作业执行情况动态调整。资源参数的调优没有一个固定的值,随着参数和配置的变化,性能的瓶颈是变化的,这就需要根据自己的实际情况(包括Spark作业中的Shuffle操作的数量、RDD持久化操作的数量,以及Spark WebUI中显示的作业GC情况等)来动态调整配置。例如,在每台机器上部署的Executors数量增加时,性能一开始是增加的,同时也观察到CPU的平均使用率在增加;但是随着单台机器上的Executors数量越来越多,性能却开始下降了,因为随着Execu-tors数量的增加,被分配到每个Executors的内存数量减小,在内存里直接进行的操作越来越少,Spill到磁盘上的数据越来越多,自然性能就变差了。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈