- cloudera manager默认是开启了spark动态资源分配的,即
spark.dynamicAllocation,enable=true
- cloudera manager默认的动态配置参数似乎不是很合理,比如
spark.dynamicAllocation.schedulerBacklogTimeout
这个参数的默认值是1秒,即当任务调度延迟超过1秒的时候,会请求增加executor,而且是指数级增加的请求,比如第一次请求1个(下一次检测周期是spark.dynamicAllocation.sustainedSchedulerBacklogTimeout
参数来决定,默认是和spark.dynamicAllocation.schedulerBacklogTimeout
一样),第二次会请求2个,第三次请求4个executor。 spark.dynamicAllocation.minExecutors
(默认是0)和spark.dynamicAllocation.maxExecutors
(默认是无限大)分别来控制动态资源分配的上下限。即申请最多不会超过maxExecutors,回收executors到minExecutors,可以通过spark.dynamicAllocation.initialExecutors
来设置启动的时候初始化多少个executors,不设置的话,默认初始化spark.dynamicAllocation.minExecutors
个executors。- 当某个executor空闲时间超过
spark.dynamicAllocation.executorIdleTimeout
值时(默认60秒),会回收该executor占用的资源,销毁executor。 - 针对实时程序如果也要动态分配资源的话,有些默认值需要根据实际情况调整一下,比如
spark.dynamicAllocation.initialExecutors
设置成2,如果每个executor一个vcore的话,至少启动两个executor,一个core给receive用,一个core用来执行计算任务。 - 实时程序首个batch可能会有一些初始化的动作在里面,比如初始化了数据库连接池,初始化redis连接池等,可能处理时间会较长,如果按
spark.dynamicAllocation.schedulerBacklogTimeout
默认的1秒阈值的话,那么就会开始申请增加executors了,这样不是很合理,可以根据实际初始化时长适当将该参数调大一点,比如调成10秒。 - 当指定了–num-executors,即明确指定了executor的个数,即使你设置了
spark.dynamicAllocation.enable=true
,动态资源分配也将无效。并在driver stderr的warn日志中看到如下警告:WARN spark.SparkContext: Dynamic Allocation and num executors both set, thus dynamic allocation disabled.
Spark动态资源分配
最新推荐文章于 2024-07-19 17:32:19 发布