本文将围绕资源管理的粒度和不同资源管理器所支持的粒度进行讨论。
粗粒度(coarse-grained)和细粒度 (fine-grained)
Spark 中的粒度是指 Spark 集群在资源分配方面的粒度,分为粗粒度和细粒度两种:
类别 | 特点 | 优点 | 缺点 | 典型例子 |
---|---|---|---|---|
粗粒度 | 静态分配资源:在application 启动时前已经为其分配好了所需的资源,后续不需要再分配资源 | task执行更快(没有资源分配造成的延迟) | 需要等到所有task都完成后,再一起释放资源,因此容易造成资源浪费;比如一个job有1000个task,完成了999个,还有一个没完成,那么999个资源就会闲置在那里等待那个task完成 | Spark on YARN(container为单位)、Spark Standalone |
细粒度 | 按需、动态分配资源:task自己去申请资源,task完成后就立即回收资源 | 便于资源控制和隔离(即更灵活)、资源利用更高效 | 如果task轻且多,资源分配释放的次数就多了,太频繁的资源调配会影响性能,task执行延迟大(每个task申请、释放资源都存在延迟) | Hadoop MapReduce |
Spark on Mesos 同时支持粗粒度和细粒度
Spark on Mesos 默认是细粒度模式(Spark 2.X版本不再支持细粒度)。
1. 设置为粗粒度的方法:
即“静态配置资源”,可以将配置项spark.mesos.coarse
设置为true
(比如在spark-default.conf
文件中)。
在粗粒度模式下,可以通过:
- 设置
spark.cores.max
来指定集群中可以使用的最大核数
; - 设置
spark.executor.memory
来配置每个executor的内存使用量
。
2. 设置为细粒度的方法:
删除
spark-default.conf文件中的配置项spark.mesos.coarse
,或者将其设置为false
。
BTW. 有些博客中会提到:在细粒度模式下运行,可以通过mesos://<url-info>
设置动态共享cpu core的执行模式。在这种模式下,应用不执行时的空闲CPU资源得以被其他用户使用,提升了CPU使用率。有清楚的大神可以帮忙解释下。
笔者水平有限,如有错误,敬请指正!
网友评论