梳理对Spark Standalone的理解

背景

本文不打算从源码分析的角度看standalone如何实现,甚至有的模块和类在分析中都是忽略掉的。

本文目的是透过spark的standalone模式,看类似spark这种执行模式的系统,在设计和考虑与下次资源管理系统对接的时候,有什么值得参考和同通用的地方,比如说接口和类体系,比如说各个执行层次的划分:面向资源的部分 vs 面向摆放的部分;面向资源里面进程的部分 vs 线程的部分等。对这些部分谈谈体会。

执行流程

解释standalone执行原理可以抛开Driver和Client。

首先,简单说明下Master、Worker、App三种角色。

Application:带有自己需要的mem和cpu资源量,会在master里排队,最后被分发到worker上执行。app的启动是去各个worker遍历,获取可用的cpu,然后去各个worker launch executor。

Worker:每台slave起一个,默认或被设置cpu和mem数,并在内存里做加减维护资源剩余量。Worker同时负责拉起本地的executor backend,即执行进程。

Master:接受Worker、app的注册,为app执行资源分配。Master和Worker本质上都是一个带Actor的进程。

接下来分析下图中的四个步骤。

第一步,register worker是一个启动集群和搜集初始资源的过程。在standalone模式下,预先在机器上使用脚本start master和slave。在这个过程中,worker的启动cpu和内存是设置好的,起来后把自己注册给master,从而master维护worker上的资源量和worker本身host、port等的信息。master的HA抛开不谈。

第二步,master接收新app的注册。app也好,driver也好,都是通过输入一个spark url提交的,最终在master内存里排队。当master有新的app进来,或资源可用性发生变化时,会触发资源分配的逻辑:

首先,将可用的alive workers进行洗牌打乱,遍历等待的drivers,为每个driver轮询遍历alive workers,只要worker的剩余mem和cpu满足该driver,那么就向那个worker通过actor sender发送一个LaunchDriver的消息,里面会包含driver的信息。

接着,遍历所有的waiting apps,同样为每个app遍历可用的worker,为其分配cpu。默认是spread out的策略,即一个app的cpus可以分布在不同的worker上。app会添加自己的executor,然后向Worker的actor传递LaunchExecutor的消息,并传递给这个app的driver一个ExecutorAdded的消息。

第三步,launch executor是一个重点。master在资源分配的逻辑里,为app分配了落在若干worker上的executors,然后对于每一个executor,master都会通知其worker去启动。standalone模式下,每个worker通过command命令行的方式启动CoarseGrainedExecutorBackend。CoarseGrainedExecutorBackend本质上也是一个Actor,里面最重要的是有一个线程池,可以执行真正的task。所以CoarseGrainedExecutorBackend具备了launchTask,killTask等方法,其TaskRunner的run()方法,调用的就是ShuffleMapTask或ResultTask的run()逻辑。

第四步,app自己来launch task。上面三步都是集群资源的准备过程,在这个过程里,app得到了属于自己的资源,包括cpu、内存、起起来的进程及其分布。在我看来,前三个过程是面向资源的调度过程,接在mesos、yarn上也可以,而第四个过程则是面向摆放的。App内的TaskScheduler和SchedulerBackend是我们熟悉的与task切分、task分配、task管理相关的内容。在之前spark任务调度的文章里也啰啰嗦嗦讲了一些。

模型分层

spark在这一块的设计是优秀的。图中,app内的SchedulerBackend是可以针对不同资源管理系统实现的,包括没有画出来的ExecutorBackend。这俩兄弟是典型的面向资源的层次上的抽象。另一方面,app内的TaskScheduler是与Task的分配和执行、管理相关的,这部分与下层面向资源的部分是隔离开的,所谓是面向摆放的。

换句话说,SchedulerBackend在1,2,3步之后,已经从集群里,获得了本身app的executors资源。通过它,TaskScheduler可以根据自己的策略,把Task与Executor对应起来,启动起来,管理起来。原本,TaskScheduler是个逻辑上的任务调度者,加上SchedulerBackend之后,其具备了操纵实际物理资源的能力,当然主要指的就是task locality与task在进程上的start和kill。

我对standalone的感受是,spark的资源索取和执行,其实是偏向于一个在线系统的。spark要跑一个app之前,也是先申请好资源量的,且资源都保证的情况下,app会一下被分配到所有资源,并得到了使用这些资源的能力。无论是mesos上还是yarn上,实现上无非主要是SchedulerBackend和Executor相关类的区别,上层逻辑上的任务调度,即TaskScheduler是不变的。

今天,我对于standalone的重看和理解,最受益的就是在线系统与资源管理衔接上的分层理解。其实资源管理系统很容易从双层,三层,划分到逻辑上四、五层。至少,我看spark在这件事情上的设计还是很清晰,有借鉴意义的。甚至standalone这套东西,也是可以单独拎出来支持其他系统的。

全文完 :)

时间: 2024-10-08 23:49:34

梳理对Spark Standalone的理解的相关文章

Spark Standalone模式

Spark Standalone模式 安装Spark Standalone集群 手动启动集群 集群创建脚本 提交应用到集群 创建Spark应用 资源调度及分配 监控与日志 与Hadoop共存 配置网络安全端口 高可用性 基于Zookeeper的Master 本地系统的单节点恢复 除了运行在mesos或yarn集群管理器中,spark也提供了简单的standalone部署模式.你可以通过手动启动master和worker节点来创建集群,或者用官网提供的启动脚本.这些守护进程也可以只在一台机器上以便

Spark standalone HA

配置Spark standalone HA 主机:node1,node2,node3 master: node1,node2 slave:node2,node3 修改配置文件: node1,node3: spark-env.sh export SPARK_MASTER_IP=node1 export SPARK_MASTER_PORT=7077 export SPARK_WORKER_CORES=1 export SPARK_WORKER_INSTANCES=1 export SPARK_WOR

大数据:Spark Standalone 集群调度(一)从远程调试开始说application创建

远程debug,特别是在集群方式时候,会很方便了解代码的运行方式,这也是码农比较喜欢的方式 虽然scala的语法和java不一样,但是scala是运行在JVM虚拟机上的,也就是scala最后编译成字节码运行在JVM上,那么远程调试方式就是JVM调试方式 在服务器端: -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=7001,suspend=y 客户端通过socket就能远程调试代码 1. 调试submit, master, worke

Windows下IntelliJ IDEA中运行Spark Standalone

ZHUAN http://www.cnblogs.com/one--way/archive/2016/08/29/5818989.html http://www.cnblogs.com/one--way/p/5814148.html 前提条件: 1.Spark Standalone 集群部署完成 2.Intellij Idea 能够运行 Spark local 模式的程序. 源码: 1 import org.apache.spark.{SparkContext, SparkConf} 2 imp

在myeclipse中使用Java语言进行spark Standalone模式应用程序开发

一.环境配置 Myeclipse中虽然已经集成了maven插件,但是由于这个插件版本较低,建立maven project会出现错误. 解决办法:自己到官网http://maven.apache.org/下载最新版本的maven插件,解压,在环境变量中注册. 新建环境变量M2_HOME 在PATH里加入maven的bin的路径 配置完毕后,在Windows命令提示符下,输入mvn -v测试一下,配置成功显示如图: 配置成功后,还需要在Myeclipse中用新的maven插件将就得替换掉,如图: 二

第1课:通过案例对Spark Streaming透彻理解三板斧之一Spark Streaming另类实验及本质解析

一. 源码定制为什么从Spark Streaming切入? Spark 一开始并没我们今天看到的Spark SQL, Spark Streaming, MLlib(machine learning), GraphX(graph), Spark R等相关内容,只有原始的Spark Core. Spark Streaming本身是Spark Core上的一个框架,透过一个框架的彻底研究肯定可以精通Spark力量的源泉和所有Spark问题的解决之道. Spark现在使用较多的除了Spark Core之

Spark Standalone 以及 HDFS系统环境搭建

Hdfs环境搭建 下载最新版本的Hadoop编译好的tar包:http://hadoop.apache.org/releases.html 确认HDFS namenode和datanode的角色,并将namenode以及datanode的ip机器名对应关系写进每台机器的/etc/hosts文件. 确认namenode可以不需要密码就一个通过ssh联通datanode结点. 执行如下命令 (1) ssh-keygen -t rsa "" //生成sshkey (2) 将 ~/.ssh/i

(二)win7下用Intelij IDEA 远程调试spark standalone 集群

关于这个spark的环境搭建了好久,踩了一堆坑,今天 环境: WIN7笔记本  spark 集群(4个虚拟机搭建的) Intelij IDEA15 scala-2.10.4 java-1.7.0 版本问题: 个人选择的是hadoop2.6.0 spark1.5.0 scala2.10.4  jdk1.7.0 关于搭建集群环境,见个人的上一篇博客:(一) Spark Standalone集群环境搭建,接下来就是用Intelij IDEA来远程连接spark集群,这样就可以方便的在本机上进行调试.

(版本定制)第1课:Spark Streaming另类在线实验及Spark Streaming本质理解

本节课内容: 1.Spark Streaming另类在线实验解析 2.Spark Streaming本质理解 Spark Streaming是Spark Core上的一个子框架,如果我们能够完全精通这个子框架,我们就能够更好的驾驭Spark.Spark Streaming和Spark SQL是目前最流行的框架,从研究角度而言,Spark SQL有太多涉及到SQL优化的问题,不太适合用来深入研究.而Spark Streaming和其他的框架不同,它更像是Spark Core的一个应用程序.如果我们