Spark指南——第五章:Spark内核解析(1)

Spark内核泛指Spark消息通信原理、作业执行原理、存储原理、运行时架构、内存管理机制、任务调度机制等等。

一、核心组件

  • 1.Application (应用程序):是指用户编写的Spark应用程序,包含驱动程序( Driver)和分布在集群中多个节点上运行的Executor 代码,在执行过程中由一个或多个作业组成。

  • 2.Driver(驱动程序):: Spark 中的Driver 即运行上述Application的main函数并且创建SparkContext,其中创建SparkContext 的目的是为了准备Spark 应用程序的运行环境。在Spark中由SparkContext 负责与ClusterManager 通信,进行资源的申请、任务的分配和监控等;当Executor部分运行完毕后,Driver 负责将SparkContext 关闭。通常用SparkContext代表Driver

  • 3.Executor (执行进程): Application 运行在Worker节点上的一个JVM进程,该进程负责运行Task, 并负责将数据存在内存或者磁盘上,每个Application都有各自独立的一批Executor。在Spark on Yarn模式下,其进程名称为CoarseGrainedExecutorBackend,类似于Hadoop MapReduce 中的YarnChild。 一个CoarseGrainedExecutorBackend进程有且仅有一个executor对象,它负责将Task包装成taskRunner,并从线程池中抽取出一个空闲线程运行Task。每个CoarseGrainedExecutorBackend能并行运行Task的数量就取决于分配给它的CPU的个数了。

  • 4.Cluster Manager (集群资源管理器):是指在集群上获取资源的外部服务,目前有支持以下三种:Standalone、Apache Mesos、Hadoop YARN

  • 5.Master (总控进程): Spark Standalone 运行模式下的主节点,负责管理和分配集群资源来运行Spark Appliation。

  • 6.Worker (工作节点):集群中任何可以运行Application 代码的节点,类似于YARN中的NodeManager节点。在Standalone模式中指的就是通过Slave文件配置的Worker节点,在SparkonYarm模式中指的就是NodeManager节点。

二、部署模式

  • Spark支持3种集群管理器(Cluster Manager),分别为:

    • 1.Standalone:独立模式,Spark原生的简单集群管理器,自带完整的服务,可单独部署到一个集群中,无需依赖任何其他资源管理系统,使用Standalone可以很方便地搭建一个集群;
    • 2.Apache Mesos:一个强大的分布式资源管理框架,它允许多种不同的框架部署在其上,包括yarn;
    • 3.Hadoop YARN:统一的资源管理机制,在上面可以运行多套计算框架,如map reduce、storm等,根据driver在集群中的位置不同,分为yarn client和yarn cluster
  • 实际上,除了上述这些通用的集群管理器外,Spark内部也提供了一些方便用户测试和学习的简单集群部署模式。由于在实际工厂环境下使用的绝大多数的集群管理器是Hadoop YARN,因此我们关注的重点是Hadoop YARN模式下的Spark集群部署

三、运行流程

1.通用流程

  • 不论Spark以何种模式进行部署,任务提交后,都会先启动Driver进程,随后Driver进程向集群管理器注册应用程序,之后集群管理器根据此任务的配置文件分配Executor并启动,当Driver所需的资源全部满足后,Driver开始执行main函数,Spark查询为懒执行,当执行到action算子时开始反向推算,根据宽依赖进行stage的划分,随后每一个stage对应一个taskset,taskset中有多个task,根据本地化原则,task会被分发到指定的Executor去执行,在任务执行的过程中,Executor也会不断与Driver进行通信,报告任务运行情况
    在这里插入图片描述

2. YARN模式运行

  • 由于在实际工厂环境下使用的绝大多数的集群管理器是Hadoop YARN,因此我们关注的重点是Hadoop YARN模式下的Spark集群部署根据driver在集群中的位置不同,分为yarn client和yarn cluster
① YARN Client模式
  • 在YARN Client模式下,Driver在任务提交的本地机器上运行,Driver启动后会和ResourceManager通讯申请启动ApplicationMaster,随后ResourceManager分配container,在合适的NodeManager上启动ApplicationMaster,此时的ApplicationMaster的功能相当于一个ExecutorLaucher,只负责向ResourceManager申请Executor内存。
  • ResourceManager接到ApplicationMaster的资源申请后会分配container,然后ApplicationMaster在资源分配指定的NodeManager上启动Executor进程,Executor进程启动后会向Driver反向注册,Executor全部注册完成后Driver开始执行main函数,之后执行到Action算子时,触发一个job,并根据宽依赖开始划分stage,每个stage生成对应的taskSet,之后将task分发到各个Executor上执行。

在这里插入图片描述

② YARN Cluster模式
  • 在YARN Cluster模式下,任务提交后会和ResourceManager通讯申请启动ApplicationMaster,随后ResourceManager分配container,在合适的NodeManager上启动ApplicationMaster,此时的ApplicationMaster就是Driver
  • Driver启动后向ResourceManager申请Executor内存,ResourceManager接到ApplicationMaster的资源申请后会分配container,然后在合适的NodeManager上启动Executor进程,Executor进程启动后会向Driver反向注册,Executor全部注册完成后Driver开始执行main函数,之后执行到Action算子时,触发一个job,并根据宽依赖开始划分stage,每个stage生成对应的taskSet,之后将task分发到各个Executor上执行。
    在这里插入图片描述
  • 下面的时序图清晰地说明了一个Spark应用程序从提交到运行的完整流程
    在这里插入图片描述

详细讲解:
① 提交一个Spark应用程序,首先通过Client向ResourceManager请求启动一个Application,同时检查是否有足够的资源满足Application的需求,如果资源条件满足,则准备ApplicationMaster的启动上下文,交给ResourceManager,并循环监控Application状态。
② 当提交的资源队列中有资源时,ResourceManager会在某个NodeManager上启动ApplicationMaster进程,ApplicationMaster会单独启动Driver后台线程,当Driver启动后,ApplicationMaster会通过本地的RPC连接Driver,并开始向ResourceManager申请Container资源运行Executor进程(一个Executor对应与一个Container),当ResourceManager返回Container资源,ApplicationMaster则在对应的Container上启动Executor。
③ Driver线程主要是初始化SparkContext对象,准备运行所需的上下文,然后一方面保持与ApplicationMaster的RPC连接,通过ApplicationMaster申请资源,另一方面根据用户业务逻辑开始调度任务,将任务下发到已有的空闲Executor上。
④ 当ResourceManager向ApplicationMaster返回Container资源时,ApplicationMaster就尝试在对应的Container上启动Executor进程,Executor进程起来后,会向Driver反向注册,注册成功后保持与Driver的心跳,同时等待Driver分发任务,当分发的任务执行完毕后,将任务状态上报给Driver。
⑤ 从上述时序图可知,Client只负责提交Application并监控Application的状态。对于Spark的任务调度主要是集中在两个方面: 资源申请和任务分发,其主要是通过ApplicationMaster、Driver以及Executor之间来完成。

四、任务调度机制

1.任务调度概述

  • RDD依赖关系:RDD 依赖关系为成 窄依赖(Narrow Dependency)宽依赖( Shuffle Dependency)窄依赖表示每个父 RDD 中的 Partition 最多被子 RDD的一个Partition 所使用宽依赖表示一个父 RDD的Partition 都会被多个子 RDD Partition 所使用

    在这里插入图片描述

  • 当Driver起来后,Driver则会根据用户程序逻辑准备任务,并根据Executor资源情况逐步分发任务。在详细阐述任务调度前,首先说明下Spark里的几个概念。一个Spark应用程序包括Job、Stage以及Task三个概念:

    • Job是以Action方法为界,遇到一个Action方法则触发一个Job;
    • Stage是Job的子集,以RDD宽依赖(即Shuffle)为界,遇到Shuffle做一次划分;
    • Task是Stage的子集以并行度(分区数)来衡量,分区数是多少,则有多少个task。
  • Spark的任务调度总体来说分两路进行,一路是Stage级的调度一路是Task级的调度,总体调度流程如下图所示:
    在这里插入图片描述

2.Stage调度

todo

3.Task调度

todo

五、消息通信原理

  • 在Spark定义了通信框架接口,这些接口实现中调用Netty的具体方法(在Spark 2.0 版本之前使用的是Akka)。在框架中以RpcEndPoint 和RpcEndpointRef实现了Actor 和ActorRef相.关动作,其中RpcEndpointRef 是RpcEndPoint 的引用,在消息通信中消息发送方持有引用RpcEndpointRef,它们之间的关系如图所示。
    在这里插入图片描述

六、where to go

第五章:Spark内核解析(2)

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页