Spark原理与架构


Spark系统架构

系统架构图
在这里插入图片描述

  1. ClusterMaster节点:ClusterMaster是整个Spark集群的核心,在集群中所处的地位与HDFS集群中的NameNode节点的地位类似。ClusterMaster节点并不执行实际的计算任务,而是负责管理整个集群的计算资源,这里所说的计算资源是指除ClusterMaster节点外其他物理主机的内存、CUP等物理资源。这些计算资源由ClusterMaster节点进行统一管理,并将资源合理地分配给用户提交的各个应用程序。所有计算节点都要向ClusterMaster节点进行注册,将自身的计算资源交给ClusterMaster节点进行统一调度。ClusterMaster节点随时监控了解这些注册的节点的运行状况,以便为应用程序提供合理的资源分配。需要注意的是,ClusterMaster节点是一个逻辑上的概念,当Spark集群采用不同模式运行时,ClusterMaster节点对应的是这些模式汇总相应管理节点。

例如:Standalone模式运行Spark时,ClusterMaster节点就是运行Master服务的节点。
YARN模式运行Spark时,对应的ClusterMaster节点为YARN中的ResourceManager节点。
Mesos模式运行Spark时,对应的ClusterMaster节点为Mesos中的Master节点。

  1. Slave节点:Slave是Spark集群中执行作业逻辑的节点。但与HDFS集群中作为Slave节点的DataNode节点只完成单一功能不同,Spark中的Slave节点又根据功能分为两类:任务调度节点(Driver)和任务执行节点(Worker)。区分这两种节点的根本方法就是看Slave节点上运行着哪种功能的进程。
  2. Driver节点:如果节点上运行了Spark程序main函数所在的进程,那么该节点就作为该应用程序的Driver节点。在Spark集群中,Driver进程可以运行在提交Spark程序的Client节点上,也可以是某个Workder节点上。

Driver节点主要负责两方面工作:

  1. 负责将一个应用程序分割为物理上可以执行的任务(Task),在Spark中,Task是物理上可执行的最小单元。一个应用程序可以启动成百上千的独立Task;
  2. 对于应用程序产生的Task,Driver进程将Task任务分配到最适合的Worker节点上运行,并协调这些Task在Workder上完成任务。
  1. Worker节点:运行Executor进程的节点为Worker节点,Spark为每一个应用程序在Worker节点上创建一个Executor进程,Executor进程是实际物任务的执行者。

Executor进程负责两方面工作:

  1. 负责执行组成应用程的独立Task计算任务,并将执行节点反馈给Driver节点。
  2. Executor进程为RDD提供内存存储。

Spark运行模式

  1. 本地(local)模式:本地模式,Spark作业是在单机使用非并行模式。
  2. 单机(Standalone)模式:Spark集群对不同的应用程序采用先进先出(FIFO)的顺序执行调度。
  3. 伪分布(local-cluster)模式:在点击环境下模拟了Standalone模式。在伪分布模式下资源的调度流程与Standalone模式完全相同,只是资源调度的不是实际的物理节点,而是在单机上运行的伪分布Spark集群。
  4. YARN模式:Spark集群运行在YARN资源管理框架上。可以为特定的应用程序分配一定数量的Executor,同时还可以对每个Executor使用的内存大小和占用CPU内核数据进行设定。
  5. Mesos模式:Spark集群运行在Mesos资源管理框架上。既可以配置Spark集群使用静态资源的分配策略,又可以配置集群中动态共享CUP内核的分配策略。在动态共享CPU内核分配策略下,每个独立的应用程序还会分配固定的内存资源,但当该应用程序所占用的某个机器的CUP内核处于空闲时,其他应用程序可以使用该空闲的CPU内核资源。

Spark运行流程

运行流程图
在这里插入图片描述

  1. 编写Spark程序(Client节点),在程序中是有一个main方法作为入口的。在主函数中执行具体的RDD创建、RDD转换、RDD存储等操作。之后编写sh脚本将Spark提交到集群中,申请Spark集群资源并执行该程序。集群收到用户提交的Spark程序后,对应的Driver进程将启动,负责响应执行用户定义的主函数。Driver进程的启动可以有两种方式:①Driver进程在客户端启动;②ClusterMaster节点指定一个Worker节点启动Driver进程,来充当Driver节点。
  2. Driver进程响应执行用户定义的主函数后,会发现主函数内部包含了RDD创建、RDD转换、RDD存储等操作,而这些操作都需要整个集群并行完成,于是Driver进程就会与ClusterMaster节点进行通信,通过ClusterMaster节点(管理着集群上可以用于并行执行任务的全部资源)申请执行程序所需的资源。
  3. 在Spark集群中的所有Worker节点都会向ClusterMaster节点注册自己的计算资源,以便ClusterMaster合理调配计算资源供应用程序使用,并且ClusterMaster节点会通过心跳检测已注册的Worker节点是否存活。在收到Driver节点的资源请求后,ClusterMaster节点会命令已注册的Worker节点启动Executor进程。
  4. 如果Worker节点是正常存活的,并且该Worker节点上Executor进程启动成功,那么,ClusterMaster节点就会将这些启动的资源通知到Driver进程,使Driver进程使用集群中的资源来并行完成Spark程序。
  5. Driver节点根据RDD在程序中的转换和执行情况对程序进行分割,分割过程会遵询Spark的内部机制。Driver节点将分割后的任务发送给已申请的多个Executor资源,每个Executor进程负责独立完成分给它的计算任务,并将执行结果反馈给Driver节点。Driver节点负责监听每个Executor进程的完成情况,统一管理整个Spark程序完成情况。
  6. Worker节点上运行的Executor进程是作业真正的执行者,在每个Worker节点上可以启动多个Executor,每个Executor单独运行一个JVM进程中,每个计算任务则是运行在Executor中的一个线程,最后,Executor负责将计算结果保存到磁盘中。
  7. Driver通知Client应用程序执行完成。

执行过程中,最重要的三个步骤

  1. 生成RDD的过程:Driver节点根据Spark程序中的代码逻辑创建出RDD。RDD被创建之后,就可以进行一系列算子操作。Spark对RDD的操作是惰性计算。在惰性计算机制中,尽管每一次算子操作将RDD转换为另一个新的RDD,并且逻辑上会顺序执行这一系列运算,但这些RDD操作并不是立即执行的,而是会等到出现行动算子时才会触发整个RDD操作,将之前的所有算子操作形成一个有向无环图(Directed Acyclic Graph,DAG),每个有向无环图再触发Spark执行一个作业(Job)。采用惰性计算的优势在于,相关的操作序列可以连续进行计算,而不用为存储的中间结果离散分布独立存储空间。这样可以节省存储空间,同时,也为之后对RDD变换操作的优化提供了条件。
  2. 生成Stage(阶段):Driver节点中的DAGSchedule(有向无环图调度)实例会对有向无环图中节点的依赖关系进行遍历,将所有曹操切分为多个调度阶段(Stage)。
  3. 生成Task(任务):每个Stage还需要转换为任务(Task)在集群中的Workder节点执行,因此,还要由Driver节点中的TaskSchedule(任务调度)实例将Stage转换为Task,并提交到Worker节点的Executor进程执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值