Spark Dynamic Allocation 分析

自Spark 1.5版本起,引入了Dynamic Allocation机制,适用于Mesos粗粒度模式及Standalone模式,通过智能管理Executor来提升集群资源利用率。本文详细介绍了动态资源调配的工作原理、配置方法及实际应用。

尊重原作出处:http://blog.youkuaiyun.com/lsshlsw/article/details/49888773

spark1.5开始为mesos粗粒度模式和standalone模式提供了Dynamic Allocation的机制。 通过将闲置executor移除,达到提高资源利用率的目的。

一.动态资源调配

spark1.5为standalone模式和mesos的粗粒度模式提供了executor的动态管理,具体表现为:如果executor在一段时间内空闲就会移除这个executor。

动态申请executor

如果有新任务处于等待状态,并且等待时间超过Spark.dynamicAllocation.schedulerBacklogTimeout(默认1s),则会依次启动executor,每次启动1,2,4,8…个executor(如果有的话)。启动的间隔由spark.dynamicAllocation.sustainedSchedulerBacklogTimeout控制(默认与schedulerBacklogTimeout相同)。

动态移除executor

executor空闲时间超过spark.dynamicAllocation.executorIdleTimeout设置的值(默认60s ),该executor会被移除,除非有缓存数据。

二.配置

conf/spark-default.conf中配置

spark.dynamicAllocation.enabled true
spark.shuffle.service.enabled true
 
  • 1
  • 2
  • 1
  • 2

开启shuffle service(每个worker节点)

sbin/start-shuffle-service.sh

启动worker

sbin/start-slave.sh -h hostname sparkURL

如果有节点没开,运行任务时该节点就报错

ExecutorLostFailure

相关配置

参数名 默认值 描述
spark.dynamicAllocation.executorIdleTimeout 60s executor空闲时间达到规定值,则将该executor移除。
spark.dynamicAllocation.cachedExecutorIdleTimeout infinity 缓存了数据的executor默认不会被移除
spark.dynamicAllocation.maxExecutors infinity 最多使用的executor数,默认为你申请的最大executor数
spark.dynamicAllocation.minExecutors 0 最少保留的executor数
spark.dynamicAllocation.schedulerBacklogTimeout 1s 有task等待运行时间超过该值后开始启动executor
spark.dynamicAllocation.executorIdleTimeout schedulerBacklogTimeout 动态启动executor的间隔
spark.dynamicAllocation.initialExecutors spark.dynamicAllocation.minExecutors 如果所有的executor都移除了,重新请求时启动的初始executor数

三.使用

启动一个spark-shell,有5个executor,每个executor使用2个core

bin/spark-shell --total-executor-cores 10 --executor-cores 2

如果在60s内无动作,在终端会看到如下提示

scala> 15/11/17 15:40:47 ERROR TaskSchedulerImpl: Lost executor 0 on spark047213: remote Rpc client disassociated
15/11/17 15:40:47 WARN ReliableDeliverySupervisor: Association with remote system [akka.tcp://sparkExecutor@spark047213:50015] has failed, address is now gated for [5000] ms. Reason: [Disassociated] 
15/11/17 15:40:50 ERROR TaskSchedulerImpl: Lost executor 1 on spark047213: remote Rpc client disassociated
15/11/17 15:40:50 WARN ReliableDeliverySupervisor: Association with remote system [akka.tcp://sparkExecutor@spark047213:49847] has failed, address is now gated for [5000] ms. Reason: [Disassociated]
...
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

吐槽一下,executor移除后会提示你和executor断开连接,给的提示居然是ERROR….

然后可以在web ui上看到使用的10个core已经处于left状态

这里写图片描述

提交一个只需要2个core的任务

sc.parallelize(1 to 2).count

看到有2个core开始进入注册状态,提供服务

这里写图片描述


`spark.dynamicAllocation.schedulerBacklogTimeout` 是 Apache Spark 中的一个配置参数,用于控制动态资源分配的行为。具体来说,这个参数决定了在向集群请求额外执行器之前,Spark 等待新任务积压的时间长度。 ### 功能 当 Spark 应用程序有积压的任务(即有任务等待执行)时,`schedulerBacklogTimeout` 参数指定了在向集群请求额外执行器之前,Spark 需要等待的时间。如果在这个时间内有积压的任务,Spark 会请求更多的执行器来处理这些任务。 ### 默认值 默认情况下,`schedulerBacklogTimeout` 的值是 1 秒。 ### 配置方法 你可以在 Spark 的配置文件 `spark-defaults.conf` 中设置这个参数,或者在提交 Spark 作业时通过命令行参数进行设置。例如: ```bash spark-submit --conf spark.dynamicAllocation.schedulerBacklogTimeout=5s ... ``` ### 相关参数 - `spark.dynamicAllocation.enabled`:启用或禁用动态资源分配。 - `spark.dynamicAllocation.minExecutors`:动态资源分配时最小的执行器数量。 - `spark.dynamicAllocation.maxExecutors`:动态资源分配时最大的执行器数量。 ### 示例 假设你设置 `spark.dynamicAllocation.schedulerBacklogTimeout` 为 5 秒,那么当有任务积压时,Spark 会等待 5 秒后再请求额外的执行器。 ### 优点 - **资源优化**:通过动态调整执行器数量,避免资源浪费。 - **性能提升**:在任务量增加时,及时增加执行器数量,提升处理速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值