Spark on Mesos: 粗粒度与细粒度实现分析 (markdown排版)

  • 背景
  • Mesos粗粒度
  • Mesos细粒度

背景

顺着昨天spark standalone实现那篇文章继续扯淡,看看Mesos Scheduler的两种实现的异同。

对我来说,回过头再仔细看Spark在这一层的实现,思路又清晰了许多。

Mesos粗粒度

CoarseMesosSchedulerBackend,是mesos的粗粒度scheduler backend实现。

简单说一下mesos的Scheduler,提供的回调函数,及spark实现的逻辑:

Mesos Scheduler接口 触发场景 spark实现逻辑
void registered(SchedulerDriver driver, FrameworkID frameworkId, MasterInfo masterInfo); 当Scheduler成向mesos master注册之后回调,会返回唯一的framework id 得到framework的id,作为appId
void reregistered(SchedulerDriver driver, MasterInfo masterInfo) 是mesos换了个新选举出来的master的时候触发,前提是该scheduler之前已经注册过了 没有实现。
void resourceOffers(SchedulerDriver driver, List[Offer] offers) mesos提供了一批可用的资源,让scheduler可以使用或拒绝这些资源。每个Offer是以slave为单位的,即以slave为单位的资源列表。 得到mesos的Offers列表,只要已经启动的executor还不足够,那么从资源列表里继续获取资源,启动CoarseGrainedExecutorBackend。
void offerRescinded(SchedulerDriver driver, OfferID offerId) 当请求的offer不可用时回调(可能是slave lost了之类的原因导致的),如果在这上面继续起task的话会报Task Lost的状态。 没有实现。spark在task scheduler层面对lost的task有自己的处理。
void statusUpdate(SchedulerDriver driver, TaskStatus status) task状态更新回调,可能是finish了,可能是lost了,可能是fail了等等 得到finished、failed、lost等task状态,更新内存里维护的task状态,并触发新一轮的reviveOffers,即通过task scheduler继续把resource分配给需要的task并执行它们。
void frameworkMessage(SchedulerDriver driver, ExecutorID executorId, SlaveID slaveId, byte[] data) 用于接收executor主动发的消息 没有实现。mesos虽然在内部提供了这种msg接口,貌似不是很稳定。使用方可以使用自己的RPC来做executor与scheduler的通信,如果真的需要的话。
void disconnected(SchedulerDriver driver) 当scheduler与master断开的时候触发,原因可能是master挂了,或者master换了等等。 没有实现。spark前面就没有实现master新选举的接口。
void slaveLost(SchedulerDriver driver, SlaveID slaveId) 通知某个slave lost了,以便framework进行任务的rescheduler或其他逻辑 spark把slave lost和executor lost一起处理了。处理逻辑就是执行RemoveExecutor操作,最终调用TaskScheduler的executorLost方法,把executor的状态移除,并且会继续向上调用DAGScheduler的handleExecutorLost方法。因executor lost可能会影响到shuffle数据,这部分还需要BlockManager感知。
void executorLost(SchedulerDriver driver, ExecutorID executorId, SlaveID slaveId, int status) 通知某个slave上的executor挂了 同上
void error(SchedulerDriver driver, String message) scheduler或scheduler driver发送错误触发 没有实现

另一方面,要说明一下mesos的SchedulerDriver

它相当于是Scheduler与mesos通信的一个连接人,一方面是管理Scheduler的生命周期,二方面是与mesos交互,让它启停task。

在初始化SchedulerDriver的时候,向里面传入spark自己实现的Scheduler就可以了,即CoarseMesosSchedulerBackend或MesosSchedulerBackend。在每个mesos的Scheduler接口的回调方法里,都会传回SchedulerDriver,以对应可以进行scheduler的启停和task的启停管理。

CoarseMesosSchedulerBackend内部主要维护的信息为:

  • slave与executor的对应关系
  • executor与task的对应关系
  • task与slave的对应关系

Mesos细粒度

翻译下注释:

细粒度模式下,允许多个app共享nodes,包括空间,即不同app的tasks可以跑同几个core,和时间,即一个core可以切换ownership。

这块共享的控制,在mesos端,所以spark在实现的时候,其实差别和难度都不大。

MesosSchedulerBackend的实现

  • 在resourceOffers逻辑里,获得mesos提供的slave资源后,直接在里面调用scheduler的resourceOffers,即TaskSchedulerImpl的分配task的逻辑。也就是说,会按优先级,从active

    task sets(来自多个app)里选择并直接launch

    task。而粗粒度里的做法,是先启动executorbackend,把资源准备好,进程先拉起,供app去launch task。

  • 其他回调接口的逻辑是大同小异的。

还有一点不同之处,粗粒度模式下executor的实现使用的是与standalone模式相同的CoarseGrainedExecutorBackend。在细粒度模式下,executor的实现是MesosExecutorBackend,实现了spark的ExecutorBackend和mesos的MesosExecutor。实际上,在类里面,还是使用的spark的executor,在对应的回调里执行start/kill task这样的操作。另外,mesos的ExecutorDriver用于负责与mesos通信,比如传递一些状态更新的消息,或有特殊的msg要发送。executor这块的差别无关紧要。



在我看来,executor这块最终一定是落到了spark的executor上,里面有一个线程池,可以跑spark的ShuffleMapTask或ResultTask。而mesos粗、细粒度的Scheduler实现,最大区别在于resourceOffers的逻辑,是怎么处理分配的进程资源:粗粒度是预先拉起执行进程,而细粒度是直接通过TaskScheduler来摆放执行线程了。

粗细粒度分别适合跑什么样的任务,可以具体见官方文档这一节

全文完 :)

时间: 2025-01-03 23:15:23

Spark on Mesos: 粗粒度与细粒度实现分析 (markdown排版)的相关文章

Spark on Mesos: 粗粒度与细粒度实现分析

背景 顺着昨天spark standalone实现那篇文章继续扯淡,看看Mesos Scheduler的两种实现的异同. 对我来说,回过头再仔细看Spark在这一层的实现,思路又清晰了许多. Mesos粗粒度 CoarseMesosSchedulerBackend,是mesos的粗粒度scheduler backend实现. 简单说一下mesos的Scheduler,提供的回调函数,及spark实现的逻辑: Mesos Scheduler回调接口一览 Mesos Scheduler接口 触发场景

《深入理解SPARK:核心思想与源码分析》——SparkContext的初始化(中)

<深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析>一书第一章的内容请看链接<第1章 环境准备> <深入理解Spark:核心思想与源码分析>一书第二章的内容请看链接<第2章 SPARK设计理念与基本架构> 由于本书的第3章内容较多,所以打算分别开辟三篇随笔分别展现. <深入理解Spark:核心思想与源码分析>一

粗粒度与细粒度权限控制

1.1   什么是粗粒度和细粒度权限 粗粒度权限管理,对资源类型的权限管理.资源类型比如:菜单.url连接.用户添加页面.用户信息.类方法.页面中按钮.. 粗粒度权限管理比如:超级管理员可以访问户添加页面.用户信息等全部页面. 部门管理员可以访问用户信息页面包括 页面中所有按钮. 细粒度权限管理,对资源实例的权限管理.资源实例就资源类型的具体化,比如:用户id为001的修改连接,1110班的用户信息.行政部的员工. 细粒度权限管理就是数据级别的权限管理. 细粒度权限管理比如:部门经理只可以访问本

Spark Job的提交与task本地化分析(源码阅读八)

我们又都知道,Spark中任务的处理也要考虑数据的本地性(locality),Spark目前支持PROCESS_LOCAL(本地进程).NODE_LOCAL(本地节点).NODE_PREF.RACK_LOCAL(本地机架).ANY(任何)几种.其他都很好理解,NODE_LOCAL会在spark日志中执行拉取数据所执行的task时,打印出来,因为Spark是移动计算,而不是移动数据的嘛. 那么什么是NODE_PREF? 当Driver应用程序刚刚启动,Driver分配获得的Executor很可能还

Spark集群无法停止的原因分析和解决

今天想停止spark集群,发现执行stop-all.sh的时候spark的相关进程都无法停止.提示: no org.apache.spark.deploy.master.Master to stop no org.apache.spark.deploy.worker.Worker to stop 上网查了一些资料,再翻看了一下stop-all.sh,stop-master.sh,stop-slaves.sh,spark-daemon.sh,spark-daemons.sh等脚本,发现很有可能是由

记录一则Spark读写和Lost Excutor错误的分析和解决过程

一.概述 上篇blog记录了些在用spark-sql时遇到的一些问题,今天继续记录用Spark提供的RDD转化方法开发公司第一期标签分析系统(一部分scala作业逻辑代码后面blog再给大家分享)遇到的一些SPARK作业错误信息.其中有些问题可能一些数据量或者shuffle量比较小的作业时不会遇到的,我们整套标签系统的初级输入数据大概是8T左右,这里也是个参考.(下面的Spark部署模式为spark on yarn) 二.问题 1.大规模数据往HDFS中写时候,报了HDFS读写超时,具体日志看下

基于SPARK SQL 读写ORACLE 的简单案例分析常见问题

该文章出自上海harli,偷偷地把女神的东西拿出来,希望女神不要介意. 一.概述 本文主要内容包含Spark SQL读写Oracle表数据的简单案例,并针对案例中比较常见的几个问题给出解决方法. 最后从常见的java.lang.ClassNotFoundException(无法找到驱动类)的异常问题出发,分析相关的几种解决方法,以及各个解决方法之间的异同点. 二.案例中比较常见问题及其解决方法 2.1 启动 首先查看Spark 官网给出的SparkSQL的编程指南部分(http://spark.

Spark与Flink大数据处理引擎对比分析!

大数据技术正飞速地发展着,催生出一代又一代快速便捷的大数据处理引擎,无论是Hadoop.Storm,还是后来的Spark.Flink.然而,毕竟没有哪一个框架可以完全支持所有的应用场景,也就说明不可能有任何一个框架可以完全取代另一个.今天,将从几个项出发着重对比Spark与Flink这两个大数据处理引擎,探讨其两者的区别. 一.Spark与Flink几个主要项目的对比与分析 1.性能对比 测试环境: CPU:7000个 内存:单机128GB 版本:Hadoop 2.3.0,Spark 1.4,F

通过 spark.files 传入spark任务依赖的文件源码分析

版本:spak2.3 相关源码:org.apache.spark.SparkContext 在创建spark任务时候,往往会指定一些依赖文件,通常我们可以在spark-submit脚本使用--files /path/to/file指定来实现. 但是公司产品的架构是通过livy来调spark任务,livy的实现其实是对spark-submit的一个包装,所以如何指定依赖文件归根到底还是在spark这边.既然不能通过命令行--files指定,那在编程中怎么指定?任务在各个节点上运行时又是如何获取到这