Fork me on GitHub

大数据资源调度平台粒度的说明

目录

  • 背景
  • 第一部分 各种资源调度器粒度
  • 第二部分 动态分配(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

0%