Spark技术原理

0.前言

1.Spark专业术语定义

(1)Application:Spark应用程序
指的是用户编写的Spark应用程序,包含Driver功能代码和分布在集群中多个节点上运行的Executor代码。Spark应用程序,由一个或多个作业Job组成,如下图所示:
在这里插入图片描述
(2)Driver:驱动程序
Spark中的Driver即运行上述Application的Main()函数并且创建SparkContext,其中创建SparkContext的目的是为了准备Spark应用程序的运行环境。在Spark中由SparkContext负责和ClusterManager通信,进行资源的申请、任务的分配和监控等;当Executor部分运行完毕后,Driver负责将SparkContext关闭。通常SparkContext代表Driver,如下图所示:
在这里插入图片描述
(3)Cluster Manager:资源管理器
指的是在集群上获取资源的外部服务,常用的有:Local,Spark单机运行,一般用于开发测试;Standalone,Spark原生的资源管理器,由Master负责资源的分配;Hadoop Yarn,由Yarn中的ResearchManager负责资源的分配;由Messos中的Messos Master负责资源管理。
(4)Executor:执行器
Application运行在Worker节点上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上,每个Application都有各自独立的一批Executor,如下图所示:
在这里插入图片描述
(5)Worker:计算节点
集群中任何可以运行Application代码的节点,类似于Yarn中的NodeManager节点。在Standalone模式中指的是通过Slave文件配置的Worker节点,在Spark on Yarn模式汇总指的就是NodeManager节点,在Spark on Messos模式中指的就是Messos Slave节点,如下图所示:
在这里插入图片描述
(6)RDD (Resilient distributed datasets):弹性分布式数据集
Spark的基本计算单元,可以通过一系列算子进行操作(主要有Transformation和Action操作),如下图所示:
在这里插入图片描述
(7)窄依赖
父RDD每一个分区最多被一个子RDD的分区所用;表现为一个父RDD的分区对应于一个子RDD的分区,或两个父RDD的分区对应于一个子RDD的分区。如图所示:
在这里插入图片描述
一个Stage内的窄依赖进行pipeline操作(Spark为了加快计算,做的优化),举例:
① 优化:1+1+1+1=4;
② 未优化:1+1=2,2+1=3,3+1=4。
(8)宽依赖
父RDD的每个分区都可能被多个子RDD分区所使用,子RDD分区通常对应所有的父 RDD分区。如图所示:
在这里插入图片描述
常见的宽窄依赖有:map、filter、union、mapPartitions、mapValues、join(父RDD是hash-partitioned:如果joinAPI之前被调用的RDD API是宽依赖【存在shuffle】,而且两个join的RDD的分区数量一致,join结果的RDD分区数量也一样,这个时候join API是窄依赖)。
常见的宽依赖有:groupByKey、partitionBy、reduceByKey、join(父RDD不是hash-partitioned:除此之外的,RDD的join API都是宽依赖)。

(9)DAG (Directed Acycle Graph):有向无环图
反应RDD之间的依赖关系,如图所示:
在这里插入图片描述
(10)DAGScheduler:有向无环图调度器
基于DAG划分Stage并以TaskSet的形式提交Stage给TaskScheduler;负责将作业拆分成不同阶段的具有宽窄依赖关系的多批任务;最重要的任务之一就是:计算作业和任务的依赖关系,指定调度逻辑。在SparkContext初始化的过程中被实例化,一个SparkContext对应一个DAGScheduler。

在这里插入图片描述
(11)TaskScheduler:任务调度器
将TaskSet提交给Worker(集群)运行并汇报结果;负责每个具体任务的实际物理调度。如图所示:

在这里插入图片描述
(13)Stage:调度阶段
一个任务对应的阶段;每个Job会被拆分很多组Task,每组任务被称为Stage,也可称TaskSet,一个作业分为多个阶段;Satge分成两种类型ShuffleMapStage、ResultStage。如图所示:
在这里插入图片描述
(14)TaskSet:任务集
由一组关联的,但相互之间没有Shuffle依赖关系的任务所组成的任务集。如图所示:
在这里插入图片描述
提示:
1) 一个Stage创建一个TaskSet;
2) 为Stage的每个RDD分区创建一个Task,多个Task分装成TaskSet。
(15)Task:任务
被送到某个Executor上的工作任务;单个分区数据集上的最小处理流程单元。如图所示:
在这里插入图片描述
在这里插入图片描述

  • Spark运行架构
    Spark运行架构

  • Spark编程模型
    Spark 应用程序从编写到提交、执行、输出的整个过程如图所示,图中描述的步骤如下:

  1. 用户使用SparkContext提供的API(常用的有textFile、sequenceFile、runJob、stop等)编写Driver application程序。此外SQLContext、HiveContext及StreamingContext对SparkContext进行封装,并提供了SQL、Hive及流式计算相关的API。
  2. 使用SparkContext提交的用户应用程序,首先会使用BlockManager和BroadcastManager将任务的Hadoop配置进行广播。然后由DAGScheduler将任务转换为RDD并组织成DAG,DAG还将被划分为不同的Stage。最后由TaskScheduler借助ActorSystem将任务提交给集群管理器(Cluster Manager)。
  3. 集群管理器(ClusterManager)给任务分配资源,即将具体任务分配到Worker上,Worker创建Executor来处理任务的运行。Standalone、YARN、Mesos、EC2等都可以作为Spark的集群管理器。

在这里插入图片描述

spark计算模型
RDD可以看做是对各种数据计算模型的统一抽象,Spark的计算过程主要是RDD的迭代计算过程。RDD的迭代计算过程非常类似于管道。分区数量取决于partition数量的设定,每个分区的数据只会在一个Task中计算。所有分区可以在多个机器节点的Executor上并行执行。

在这里插入图片描述
集群架构设计

在这里插入图片描述

整个集群分为 Master 节点和 Worker 节点,相当于 Hadoop 的 Master 和 Slave 节点。 Master 节点上常驻 Master 守护进程,负责管理全部的 Worker 节点。 Worker 节点上常驻 Worker 守护进程,负责与 Master 节点通信并管理 executors。 Driver 官方解释是 “The process running the main() function of the application and creating the SparkContext”。Application 就是用户自己写的 Spark 程序(driver program。

spark 运行流程

在这里插入图片描述

  1. 构建Spark Application的运行环境,启动
  2. SparkContextSparkContext向资源管理器(可以是Standalone,Mesos,Yarn)申请运行Executor资源,并启动StandaloneExecutorbackend,
  3. Executor向SparkContext申请Task
  4. SparkContext将应用程序分发给Executor
  5. SparkContext构建成DAG图,将DAG图分解成Stage、将Taskset发送给Task Scheduler,最后由Task Scheduler将Task发送给Executor运行
  6. Task在Executor上运行,运行完释放所有资源

参考

Geek-增强版-大数据-Spark

Spark原理篇之工作原理

深入理解spark之架构与原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值