spark的excutor调优思路

spark的excutor调优主要考虑两种资源:内存和cpu核心数

优先保证程序可运行的情况下增加excutor数量

在spark中,一个excutor是一个进程,是内存资源分配的基本单位。理论上excutor的数量可以非常大,但是yarn有资源管理的功能,如果excutor占用的资源超过了集群拥有的资源,多余的进程会被挂起。所以第一原则是单个excutor分配的资源要满足程序运行要求的情况下尽量的小,excutor的数量尽量多。

在满足程序可正确运行的基础上,提高并行数。也是就每个excutor的核心数

如果excutor是一个进程的话,那excutor的核心就是该线程的进程了。同一个线程的进程是共享资源的。

折中策略

我们说多个核心是共享内存的,也就意味着,如果我们增加每个excutor的核心数,我们就要增加excutor的内存大小,那excutor的数量就该减少。那我们是该以多进程(多 excutor)为主呢,还是以多线程(多核心)为主呢。

有一个简单的excutor的内存估算策略:

Executor所需最小内存 
=  并发任务数 * 单分区大小 + 内存缓存分区数 * 单分区大小 
= (核心数 + 内存缓存分区数) * 单个分区大小

由上面的内存估算策略可知,核心数对内存分配的影响是非常小的。所以我们只需要单个核心的情况下能跑通程序,那多个核心一般以没什么问题。

但是如果按照官网的建议:

Spark作业的默认task数量为500~1000个较为合适
每个Spark作业的运行一般设置50~100个左右的Executor进程比较合适
Executor的CPU core数量设置为2~4个较为合适。

这样平均下来 每个excutor也就只分配10到20个task和cpu core数量是同一个量级,这样盲目增大cpu core核心数可能会导致内存不足。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章