Spark 简介
Spark简介
什么是spark
官网给出了spark的定义:unified analytics engine for large-scale data processing. 一个针对大规模数据处理一个通用分析引擎。包含以下特点:
- speed:执行效率高。
- ease of use:提供了Java,Python,Scala等多种语言的api接口。
- generality :包含SparkSQL、SparkStreaming、MLlib、GraphX等组件。
- run everywhere:除了spark自带的standalone外,还可以在yarn、Mesos多种资源管理器上运行;提供上百种数据源访问包括:hdfs,hive,hbase等
相关的专业术语
参考:http://www.raincent.com/content-85-11052-1.html
Application:指用户编写的Spark应用程序,包含Driver功能代码和分布在集群中多个节点上运行的Executor代码。程序在实际运行过程中,由一个或多个作业JOB组成,如下图所示:

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

Cluster Manager资源管理器:指的是在集群上获取资源的外部服务,常用的有:
- Standalone,Spark原生的资源管理器,由Master负责资源的分配;
- Haddop Yarn,由Yarn中的ResearchManager负责资源的分配;
- Messos,由Messos中的Messos Master负责资源管理,如下图所示:

Executor执行器:Application运行在Worker节点上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上,每个Application都有各自独立的一批Executor,如下图所示:

Worker计算节点:集群中任何可以运行Application代码的节点,类似于Yarn中的NodeManager节点。在Standalone模式中指的就是通过Slave文件配置的Worker节点,在Spark on Yarn模式中指的就是NodeManager节点,在Spark on Messos模式中指的就是Messos Slave节点,如下图所示:

RDD弹性分布式数据集:Resillient Distributed Dataset,Spark的基本计算单元,通过一系列算子进行操作(主要有Transformation和Action操作),如下图所示:

窄依赖:父RDD每一个分区最多被一个子RDD的分区所用;表现为一个父RDD的分区对应于一个子RDD的分区,或两个父RDD的分区对应于一个子RDD 的分区。常见的窄依赖有:map、filter、union、mapPartitions、mapValues、join(父RDD是hash-partitioned :如果JoinAPI之前被调用的RDD API是宽依赖(存在shuffle), 而且两个join的RDD的分区数量一致,join结果的rdd分区数量也一样,这个时候join api是窄依赖)。

宽依赖:父RDD的每个分区都可能被多个子RDD分区所使用,子RDD分区通常对应所有的父RDD分区。常见的宽依赖有groupByKey、partitionBy、reduceByKey、join(父RDD不是hash-partitioned :除此之外的,rdd 的join api是宽依赖)

DAG有向无环图:Directed Acycle graph,反应RDD之间的依赖关系,

DAGScheduler:基于DAG划分Stage 并以TaskSet的形势提交Stage给TaskScheduler;负责将作业拆分成不同阶段的具有依赖关系的多批任务;最重要的任务之一就是:计算作业和任务的依赖关系,制定调度逻辑。在SparkContext初始化的过程中被实例化,一个SparkContext对应创建一个DAGScheduler。

TaskScheduler:将Taskset提交给worker(集群)运行并回报结果;负责每个具体任务的实际物理调度。如图所示:

Job:由一个或多个调度阶段所组成的一次计算作业;包含多个Task组成的并行计算,往往由Spark Action催生,一个JOB包含多个RDD及作用于相应RDD上的各种Operation。如图所示:

Stage:调度阶段
一个任务集对应的调度阶段;每个Job会被拆分很多组Task,每组任务被称为Stage,也可称TaskSet,一个作业分为多个阶段;Stage分成两种类型ShuffleMapStage、ResultStage。如图所示:

TaskSet任务集:由一组关联的,但相互之间没有Shuffle依赖关系的任务所组成的任务集。

- 一个Stage创建一个TaskSet;
- 为Stage的每个Rdd分区创建一个Task,多个Task封装成TaskSet

一个完整的Application关于作业划分的流程如下图所示:

DAG划分为Stage核心算法:
划分依据:Stage划分的依据就是宽依赖,何时产生宽依赖,reduceByKey, groupByKey等算子,会导致宽依赖的产生。
核心算法:从后往前回溯,遇到窄依赖加入本stage,遇见宽依赖进行Stage切分。Spark内核会从触发Action操作的那个RDD开始从后往前推,首先会为最后一个RDD创建一个stage,然后继续倒推,如果发现对某个RDD是宽依赖,那么就会将宽依赖的那个RDD创建一个新的stage,那个RDD就是新的stage的最后一个RDD。然后依次类推,继续继续倒推,根据窄依赖或者宽依赖进行stage的划分,直到所有的RDD全部遍历完成为止。

最后给出Spark运行的整体流程图:

任务调度总体诠释


浙公网安备 33010602011771号