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 =========================

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

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

    本文主要记录我使用Spark以来遇到的一些典型问题及其解决的方法,希望对遇到相同问题的同学们有所帮助. 1. Spark环境或配置相关 Q: Sparkclient配置文件spark-defaults ...

  2. Spark调研笔记第2篇 - 怎样通过Sparkclient向Spark提交任务

    在上篇笔记的基础上,本文介绍Sparkclient的基本配置及Spark任务提交方式. 1. Sparkclient及基本配置 从Spark官网下载的pre-built包中集成了Sparkclient ...

  3. Spark调研笔记第4篇 - PySpark Internals

    事实上.有两个名为PySpark的概念.一个是指Sparkclient内置的pyspark脚本.而还有一个是指Spark Python API中的名为pyspark的package. 本文仅仅对第1个 ...

  4. Spark学习笔记1——第一个Spark程序:单词数统计

    Spark学习笔记1--第一个Spark程序:单词数统计 笔记摘抄自 [美] Holden Karau 等著的<Spark快速大数据分析> 添加依赖 通过 Maven 添加 Spark-c ...

  5. Spark性能优化指南-高级篇(spark shuffle)

    Spark性能优化指南-高级篇(spark shuffle) 非常好的讲解

  6. Spark学习笔记1(初始spark

    1.什么是spark? spark是一个基于内存的,分布式的,大数据的计算框架,可以解决各种大数据领域的计算问题,提供了一站式的服务 Spark2009年诞生于伯克利大学的AMPLab实验室 2010 ...

  7. JMS学习篇《一》ActiveMQ消息中间件的简单介绍与用法-概念篇

    原创说明:本篇博文为本人原创作品,转载请注明出处 1.何为消息中间件 消息中间件是一种在分布式应用中互相交换信息的一种技术,常见的成熟消息中间件有:RabbitMQ.SonicMQ,activeMQ. ...

  8. Spark学习笔记(三)-Spark Streaming

    Spark Streaming支持实时数据流的可扩展(scalable).高吞吐(high-throughput).容错(fault-tolerant)的流处理(stream processing). ...

  9. spark复习笔记(3):使用spark实现单词统计

    wordcount是spark入门级的demo,不难但是很有趣.接下来我用命令行.scala.Java和python这三种语言来实现单词统计. 一.使用命令行实现单词的统计 1.首先touch一个a. ...

随机推荐

  1. java读取配置文件的推荐方法getResource、getResourceAsStream

    在java开发中经常会读取配置文件,如果把文件路径写死,就太LOW了,也不符合编码规范. 在网上找了一些资料后,发现有两种方法:xxx.class.getResource("")  ...

  2. java 生成二维码工具

    二维码生成 Gitee:https://gitee.com/search?utf8=%E2%9C%93&search=qrext4j&group_id=&project_id= ...

  3. python实现快速排序、冒泡

    快速排序:首先任意选取一个数据(通常选用数组的第一个参数)作为关键数据,然后将比它小的数放在它前面,比它大的数放在后面,这个过程称之为快速排序 def quick_sort(l): if len(l) ...

  4. 【三种负载均衡器的优缺点】LVS Nginx HAProxy

    搭建负载均衡高可用环境相对简单,主要是要理解其中原理.此文描述了三种负载均衡器的优缺点,以便在实际的生产应用中,按需求取舍. 目前,在线上环境中应用较多的负载均衡器硬件有F5 BIG-IP,软件有LV ...

  5. #region 私有字段

    #region 私有字段                   private string _读者类别;          private string _读者类别名称;          priva ...

  6. 【转载】CentOS6.5升级手动安装GCC4.8.2

    一.简易安装 操作环境 CentOS6.5 64bit,原版本4.4.7,不能支持C++11的特性~,希望升级到4.8.2 不能通过yum的方法升级,需要自己手动下载安装包并编译 1.1 获取安装包并 ...

  7. [luoguP1666] 前缀单词(DP)

    传送门 先把所有字符串按照字典序排序一下 会发现有字符串x和y(x再y前面,即字典序小),如果x不是y的前缀,那么在x前面不是x前缀的字符串也不是y的前缀 这样就可以DP了 f[i][j]表示前i个字 ...

  8. BZOJ 1412: [ZJOI2009]狼和羊的故事【网络流】

    Description “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! O ...

  9. 洛谷P1016 旅行家的预算

    题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...

  10. hdu 1879

    #include<stdio.h> #include<stdlib.h> #define N 100 struct node { int x,y,dis; }road[N*N] ...