Spark调研笔记第3篇 - Spark集群对应用的调度策略简介

Spark集群的调度分应用间调度和应用内调度两种情况,下文分别进行说明。

1. 应用间调度

1) 调度策略1: 资源静态分区

资源静态分区是指整个集群的资源被预先划分为多个partitions,资源分配时的最小粒度是一个静态的partition。根据应用对资源的申请需求为其分配静态的partition(s)是Spark支持的最简单的调度策略。

我们已经知道,不同的应用有各自的Spark Context且占用各自的JVM和executor(s)。根据Spark Job Scheduling文档的说明,若Spark集群配置了static partitioning的调度策略,则它对提交的多个应用间默认采用FIFO顺序进行调度,每个获得执行机会的应用在运行期间可占用整个集群的资源,这样做明显不友好,所以应用提交者通常需要通过设置spark.cores.max来控制其占用的core/memory资源。

2) 调度策略2: 动态共享CPU cores

若Spark集群采用Mesos模式,则除上面介绍的static partitioning的调度策略外,它还支持dynamic sharing of CPU cores的策略。

在这种调度策略下,每个应用仍拥有各自独立的cores/memory,但当应用申请资源后并未使用时(即分配给应用的资源当前闲置),其它应用的计算任务可能会被调度器分配到这些闲置资源上。当提交给集群的应用有很多是非活跃应用时(即它们并非时刻占用集群资源),这种调度策略能很大程度上提升集群资源利用效率。

但它带来的风险是:若某个应用从非活跃状态转变为活跃状态时,且它提交时申请的资源当前恰好被调度给其它应用,则它无法立即获得执行的机会。

3) 调度策略3: 动态资源申请

Spark 1.2引入了一种被称为Dynamic Resource Allocation的调度策略,它允许根据应用的workload动态调整其所需的集群资源。也即,若应用暂时不需要它之前申请的资源,则它可以先归还给集群,当它需要时,可以重新向集群申请。当Spark集群被多个应用共享时,这种按需分配的策略显然是非常有优势的。

在当前Spark版本下,动态资源申请是以core为粒度的。

需要特别注意的是,动态资源申请的调度策略默认是不启用的,且目前只支持在YARN模式(通过设置spark.dynamicAllocation.enabled可以启用该策略),根据Spark文档的说明,将来的版本会支持standalone模式和Mesos模式。

2. 应用内调度

在应用内部(每个Application在Spark集群看来均是一个独立的Spark Context),每个action(spark支持的rdd action列表见这里)以及计算这个action结果所需要的一系列tasks被统称为一个"job"。

默认情况下,Spark调度器对同一个Application内的不同jobs采用FIFO的调度策略。每个job被分解为不同的stages(spark支持的每个rdd transformation即为一个stage,完整的transformations列表见这里),当多个job各自的stage所在的线程同时申请资源时,第1个job的stage优先获得资源。如果job
queue头部的job恰好是需要最长执行时间的job时,后面所有的job均得不到执行的机会,这样会导致某些job(s)饿死的情况。

从Spark 0.8开始,Spark集群对同一Application内的jobs的调度策略可以被配置为"fair sharing",具体而言,Spark对不同jobs的stages提交的tasks采用Round Robin的调度方式,如此,所有的jobs均得到公平执行的机会。因此,即使某些short-time jobs本身的提交时间在long jobs之后,它也能获得被执行的机会,从而达到可预期的响应时间。

要启用fair sharing调度策略,需要在spark配置文件中将spark.scheduler.mode设置为FAIR。

此外,fair sharing调度也支持把不同的jobs聚合到一个pool,不同的pools赋予不同的执行优先级。这是FIFO和fair sharing两种策略的折衷策略,既能保证jobs之间的优先级,也能保证同一优先级的jobs均能得到公平执行的机会。

具体的设置细节请参考Spark相关的配置文档,这里不赘述。

【参考资料】

1. Job Scheduling

2. Spark Programming Guide - Actions

3. Spark Programming Guide - Transformations

============================== EOF =========================

时间: 2024-10-26 11:53:31

Spark调研笔记第3篇 - Spark集群对应用的调度策略简介的相关文章

Spark调研笔记第3篇 - Spark集群相应用的调度策略简单介绍

Spark集群的调度分应用间调度和应用内调度两种情况,下文分别进行说明. 1. 应用间调度 1) 调度策略1: 资源静态分区 资源静态分区是指整个集群的资源被预先划分为多个partitions,资源分配时的最小粒度是一个静态的partition. 依据应用对资源的申请需求为其分配静态的partition(s)是Spark支持的最简单的调度策略. 我们已经知道,不同的应用有各自的Spark Context且占用各自的JVM和executor(s).依据Spark Job Scheduling文档的

Spark调研笔记第1篇 - Spark简介

在公司线上项目中引入Spark已经将近1年时间了,从效果来看,Spark确实是能提高生产力的优秀分布式计算平台. 从本篇笔记开始,会把之前调研Spark时的调研报告分享出来(限于篇幅,会分成几篇文章),以便帮助刚接触Spark的朋友们尽快入门. 下面开始正文. 1. 项目背景 Spark项目于2009年诞生于UC Berkeley AMP Lab并于2010年正式提交Apache Software Foundation成为开源项目.目前已经成为Apache下的明星项目,其代码提交活跃度在整个社区

Spark调研笔记第6篇 - Spark编程实战FAQ

本文主要记录我使用Spark以来遇到的一些典型问题及其解决办法,希望对遇到同样问题的同学们有所帮助. 1. Spark环境或配置相关 Q: Spark客户端配置文件spark-defaults.conf中,spark.executor.memory和spark.cores.max应该如何合理配置? A: 配置前,需要对spark集群中每个节点机器的core和memory的配置有基本了解.比如由100台机器搭建的spark集群中,每个节点的配置是core=32且memory=128GB,那么,向该

Spark调研笔记第5篇 - Spark API简单介绍

因为Spark是用Scala实现的,所以Spark天生支持Scala API.此外,还支持Java和Python API. 以Spark 1.3版本号的Python API为例.其模块层级关系例如以下图所看到的: 从上图可知,pyspark是Python API的顶层package,它包括了几个重要的subpackages.当中: 1) pyspark.SparkContext 它抽象了指向spark集群的一条连接,可用来创建RDD对象,它是API的主入口. 2) pyspark.SparkCo

Spark调研笔记第5篇 - Spark API简介

由于Spark是用Scala实现的,所以Spark天生支持Scala API,此外,还支持Java和Python API.以Spark 1.3版本的Python API为例,其模块层级关系如下图所示: 从上图可知,pyspark是Python API的顶层package,它包含了几个重要的subpackages,其中: 1) pyspark.SparkContext 它抽象了指向spark集群的一条连接,可用来创建RDD对象,它是API的主入口. 2) pyspark.SparkConf 通过它

Spark调研笔记第7篇 - 应用实战: 如何利用Spark集群计算物品相似度

本文是Spark调研笔记的最后一篇,以代码实例说明如何借助Spark平台高效地实现推荐系统CF算法中的物品相似度计算. 在推荐系统中,最经典的推荐算法无疑是协同过滤(Collaborative Filtering, CF),而item-cf又是CF算法中一个实现简单且效果不错的算法. 在item-cf算法中,最关键的步骤是计算物品之间的相似度.本文以代码实例来说明如何利用Spark平台快速计算物品间的余弦相似度. Cosine Similarity是相似度的一种常用度量,根据<推荐系统实践>一

Spark调研笔记第4篇 - PySpark Internals

其实,有两个名为PySpark的概念,一个是指Spark客户端内置的pyspark脚本,而另一个是指Spark Python API中的名为pyspark的package. 本文只对第1个pyspark概念做介绍. 1. Spark客户端内置的pyspark"命令" Spark客户端支持交互模式以方便应用调试,通过调用pyspark可以进入交互环境: cd /path/to/spark/ && ./bin/pyspark 用编辑器查看可知,pyspark其实是个shel

编写Spark的WordCount程序并提交到集群运行[含scala和java两个版本]

编写Spark的WordCount程序并提交到集群运行[含scala和java两个版本] 1. 开发环境 Jdk 1.7.0_72 Maven 3.2.1 Scala 2.10.6 Spark 1.6.2 Hadoop 2.6.4 IntelliJ IDEA 2016.1.1 2. 创建项目1) 新建Maven项目 2) 在pom文件中导入依赖pom.xml文件内容如下: <?xml version="1.0" encoding="UTF-8"?> &l

蜗龙徒行-Spark学习笔记【三】Spark集群中worker节点扩展实战经验

一.集群原先配置: 从机名sparkMaster,Ubuntu12.04-32 ,用户名Root , 内存4g    (只用于任务调度和分配,不做计算节点) 从机名sparkSlave1,Ubuntu12.04-32 ,用户名Root , 内存4g    (计算节点) 从机名sparkSlave2,Ubuntu12.04-32 ,用户名Root , 内存1.7g (计算节点) 二.扩展原因:计算数据量增大,原先的两个工作节点已不不能满足实时性的需求,由于实验室计算资源有限,故将原先的调度节点也增