Spark性能调优之资源分配

Spark性能调优之资源分配

1. 分配哪些资源?

spark任务可以分配的资源主要包括 executor、cpu per executor、memory per executor、driver memory

2. 在哪里分配这些资源?

在我们在生产环境中,在提交spark作业时,用的spark-submit shell脚本,里面调整对应的参数

3. 调节到多大,算是最大呢?

第一种,Spark Standalone。公司集群上搭建了一套Spark集群,你应该可以知道每台机器还能够给你使用的大概有多少内存,多少cpu core;设置的时候需要根据这个实际的情况去调节每个spark作业的资源分配。比如说你的每台机器能够给你使用4G内存,2个cpu core;一共20台机器,那么就可以配置20个executor,平均每个executor 4G内存,2个cpu core。

第二种,Yarn。资源队列。应该去查看你的spark作业要提交到的资源队列大概有多少资源?

一个原则,你能使用的资源有多大,就尽量去调节到最大的大小(executor的数量,几十个到上百个不等;executor内存;executor cpu core)

4. 为什么调节了资源以后,性能可以提升?

(1)增加每个executor的cpu core。

增加每个executor的 cpu core 可以增加了并行能力。原本20个executor,每个才2个cpu core,能够并行执行的task数量为40个。现在每个executor的cpu core 增加到了5个,能够并行执行的task数量为100个。执行的速度,提升了2.5倍。

(2)增加executor。

如果executor数量比较少,那么能够并行执行的task数量就比较少,Application的并行执行的能力就很弱。比如有3个executor,每个executor有2个cpu core,那么同时能够并行执行的task就是6个。6个执行完以后,再换下一批6个task。增加了executor数量以后能够并行执行的task数量也就变多了。比如原先是6个,现在可能可以并行执行10个,甚至20个,100个。那么并行能力就比之前提升了数倍,数十倍。

相应的,性能(执行的速度),也能提升数倍~数十倍。

(3)增加每个executor的内存量。

增加了内存量以后,对性能的提升,有两点:

a. 如果需要对RDD进行cache,更多的内存就可以缓存更多的数据,将更少的数据写入磁盘,甚至不写入磁盘。减少了磁盘IO。

b. 对于shuffle操作,reduce端,会需要内存来存放拉取的数据并进行聚合。如果内存不够,也会写入磁盘。如果给executor分配更多内存以后,就有更少的数据需要写入磁盘甚至不需要写入磁盘。减少了磁盘IO,提升了性能。

c. 对于task的执行,可能会创建很多对象。如果内存比较小,可能会频繁导致JVM堆内存满了,然后频繁GC,垃圾回收,minor GC和full GC。(速度很慢)。内存加大以后,带来更少的GC,垃圾回收,避免了速度变慢,速度变快了。

原文: https://mp.weixin.qq.com/s/PnHR31k57QEwHVblLBKOGw

posted @ 2020-12-29 18:54  宁君  阅读(579)  评论(0编辑  收藏  举报