目录
- 背景
- 第一部分 各种资源调度器粒度
- 第二部分 动态分配(Dynamic Allocation)
- 参考文献及资料
背景
我们在Yarn
资源管理器上提交MapReduce
任务的时候发现(Yarn Web
控制台),任务使用的container
数量是变化的。其实这是由于MapReduce
任务在Yarn
上资源分配的粒度是:细粒度的。接下来我们将介绍资源调度管理器的粒度。
第一部分 各种资源调度器粒度
我们知道Spark最开始没有Yarn和Srandalone模式的时候,只有Mesos资源管理器。后来才有了Yarn,最后为了推广才产生了Standalone模式。
1.1 Mesos
集群
Spark on Mesos
模式下,同时支持粗粒度(coarse-grained)和细粒度(fine-grained),等到高版本Spark 2.X
版本后不再支持细粒度。低版本默认配置是细粒度。
Fine-grained mode is deprecated as of Spark 2.0.0。Consider using Dynamic Allocation for some of the benefits. For a full explanation see SPARK-11857
- 设置为粗粒度
Spark配置项spark.mesos.coarse
设置为true
(可以在spark-default.conf
配置文件中或者代码配置中)。在粗粒度模式下,可以通过下面3个参数指定静态资源:
设置spark.cores.max
,最大使用CPU资源;
设置spark.executor.memory
,每个executor的内存资源;
设置spark.executor.cores
,每个executor的CPU资源;
- 设置为细粒度
注释spark-default.conf
文件中的配置参数:spark.mesos.coarse
,或者将其设置为false
。
在细粒度模式下,Spark执行器中的每个Spark任务都作为单独的Mesos任务运行。这允许Spark的多个实例(和其他框架)以非常精细的粒度共享内核,其中每个应用程序在逐步增加和减少时将分配或多或少的内核,但是在启动每个任务时会带来额外的开销。此模式不适用于低延迟要求。
在Spark 2.x
版本后,取消了对Mesos
细粒度的支持,而是引入: Dynamic Allocation
1.2 Yarn集群
1.2.1 细粒度
MapReduce
任务在Yarn上是细粒度模式。资源按需动态分配,每一个task均可以去申请资源,使用完后立即释放回收。提高集群计算资源的高效利用。但是如果task任务轻而多,那么就会出现task实际使用计算资源时间短,但是申请数量多,这就导致大量运行时间其实是花费在资源申请分配和释放上。
注:在实际生产中,使用MapReduce定时任务拉取Kafka数据汇入hive,就会出现短时间申请大量资源,实际计算时间很短,使得集群资源出现脉冲现象,资源使用极不平稳,引起相关性能容量告警。
1.2.2 粗粒度
Spark on Yarn是粗粒度模式。资源静态分配。Spark Application在运行前就已经分配好需要的计算资源,没有task申请资源的时间延迟。但是资源释放上需要等待所有的task均执行完毕,才会触发所有资源的释放回收。特别极端的例子就是,一个job有100个task,完成了99个,还有一个没完成,那么所有资源就会闲置在那里等待那个task完成后才释放 。
1.3 Standalone集群
Spark自身的Standalone集群也是粗粒度,和Spark on Yarn的粗粒度类似。
第二部分 动态分配(Dynamic Allocation)
Spark在2.x开始抛弃在Mesos集群上对细粒度模式的支持,而是转而在粗粒度模式下提供动态分配机制(Dynamic Allocation)。其实Spark在1.2版本后,在Spark on Yarn上就已经提供对动态分配机制(Dynamic Allocation)的支持。所以动态分配机制是未来架构的方向,可以补充粗粒度在资源有效利用方面的不足。我们将在其他文章中介绍这种资源调度模式。
参考文献及资料
1、Running Spark on Mesos
,链接:https://spark.apache.org/docs/latest/running-on-mesos.html