spark的设计与运行原理

一、Spark简介

  1. spark的特点
    (1) 运行速度快

使用DAG执行引擎以支持循环数据流与内存计算

(2) 容易使用

支持使用Scala、Java、Python和R语言进行编程,可以通过Spark Shell 进行交互式编程

(3) 通用性

Spark提供了完整而强大的技术栈,包括SQL查询,流式计算,机器学习和图算法组件

(4) 运行模式多样

可以运行独立的集群模型种,可运行于Hadooo中,也运行于Amazon EC2等云环境中,并且可以访问HDFS、Cassandra、HBase、Hive等多种数据源。

  1. Spark与Hadoop的对比

(1) Spark的计算模型也属于MapReduce,但不局限于Map和Reduce操作,还可以提供了多种数据集操作类型,编程模型比Hadoop MapReduce更灵活
(2)Spark提供了内存计算,可以将中间结果放到内存中,对于迭代运行效率更高。
(3)Spark基于DAG的任务调度执行机制,要要优于Hadoop MapReduce的迭代执行机制

《spark的设计与运行原理》 图1

二、Spark生态系统

Spark生态系统已经成为伯克利数据分析软件栈BDAS(Berkeley Data Analytics Stack)的重要组成部分

《spark的设计与运行原理》 图2

Spark的生态系统主要包含了Spark Core、Spark SQL、Spark Streaming、MLLib和GraphX等组件。
Spark生态系统组件的应用场景

《spark的设计与运行原理》 图3

三、Spark运行框架

  1. 基本概念
    (1) RDD

弹性分布式数据集,是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型

(2) DAG

有向无环图,反映RDD之间的依赖关系

(3) Executor

是运行在工作节点的一个进程,负责运行Task

(4) Application

用户编写Spark应用程序

(5) Task

运行在Executor上的工作单元

(6) job

一个job包含多个Rdd及作用于相应RDD上的各种操作

(7) Stage

是Job的基本调度单位,一个Job会分为多组Task,每组Task被称为Stage,或者被称为TaskSet,代表了一组关联的、相互之间没有Shuffle依赖关系任务组成的任务集

三、Spark架构设计

  1. Spark运行架构包括集群资源管理器(Cluster Manager)、运行作业任务的工作节点(Worker Node)、每个应用的任务控制节点(Driver)和每个工作节点上负责具体任务的执行进行(Executor)
    资源管理器可以自带或Mesos或YARN

  2. Spark所采用的Executor有两个优点:
    1.利用多线程来执行具体的任务,减少任务的启动开销
    2.Executor中有一个BlockManager存储模块,会将内存和磁盘共同作为存储设备,有效减少IO开销

    《spark的设计与运行原理》 图4

  3. 一个Application由一个Driver和若干个Job构成,一个Job由多个Stage构成,一个Stage由多个没有Shuffle关系的Task组成。
    当执行一个Application时,Driver会向集群管理器申请资源,启动Executor,并向Executor发送应用程序代码和文件,然后在Executor上执行Task,运行结果后,执行结果会返回给Driver,或者写到HDFS或者其他数据库中

《spark的设计与运行原理》 图5

  1. Spark运行基本流程

(1) 首先为应用构建起基本的运行环境,即由Driver创建一个SparkContext,进行资源的申请、任务发分配和监控
(2) 资源管理器为Executor分配资源,并启动Executor进程
(3) SparkContext根据RDD的依赖关系构建DAG图,DAG图提交给DAGScheduler解析成Stage,然后把一个个TaskSet提交给底层调度器Taskscheduler处理;Executor向SparkContext申请Task发给Executor运行,并提供应用程序代码
(4) Task在Executor上运行,把执行结果反馈给TaskScheduler,然后反馈给DAGScheduler,运行完毕后写入数据并释放所有资源。

《spark的设计与运行原理》 图6

  1. Spark运行架构具有一下特点:

(1)每个Application都有自己专属的Executor进程,并且该进程在Application运行期间一直驻留。Executor进程以多线程的方式运行Task
(2) Spark运行过程与资源管理器无关,只要能够获取Executor进程并保持通信即可。
(3) Task采用了数据本地性和推测执行等优化机制。

四、RDD概念原理

  1. RDD概念

(1)一个RDD就是一个分布式对象集合,本质上是一个只读的分区记录集合,每个RDD可分成多个分区,每个分区就是一个数据集片段,并且一个RDD的不同分区可以被保存到集群中不同的节点上,从而可以在集群中不同节点上进行并行计算
(2) RDD提供了一组丰富的操作以支持常见的数据运算,分为”Action”和”Transformation”两种类型。

  1. RDD特性
    (1) 高效的容错性

现有容错机制:数据负责或者记录日志。
RDD:血缘关系、重新计算丢失分区、无需回滚系统、重算过程在不同节点之间并行、只记录粗粒度的操作

(2) 中间结果持久化到内存,数据在内存中的多个RDD操作之间进行传递,避免了必要的读写磁盘开销

(3) 存放的数据可以是Java对象,避免了不必要的对象序列化和反序列化

  1. RDD之间的依赖关系
    (1) 窄依赖

窄依赖表现为一个父RDD的分区对应一个子RDD的分区或多个父RDD的分区对应一个子RDD的分区

《spark的设计与运行原理》 图7

(2) 宽依赖

宽依赖则表现为存在一个父RDD的一个分区对应一个子RDD的多个分区

《spark的设计与运行原理》 图8

  1. Stage划分
    (1) 在DAG中进行反向解析,遇到宽依赖就断开
    (2) 遇到窄依赖就把当前的RDD加入到Stage中
    (3) 将窄依赖尽量划分到同一个Stage中,可以实现流水线计算

《spark的设计与运行原理》 图9

DAGScheduler的stage划分算法总结:会从触发action操作的那个rdd开始反向解析,首先会为最后一个rdd创建一个stage,反向解析的时候,遇到窄依赖就把当前的rdd加入到Stage,遇到宽依赖就断开,将宽依赖的那个rdd创建一个新的stage,那个rdd就是这个stage最后一个rdd。依此类推,遍历所有RDD为止。

  1. RDD运行过程
    RDD在Spark架构中的运行过程
    (1)创建RDD对象
    (2)SparkContext负责计算RDD之间的依赖关系,构建RDD;
    (3)DAGScheduler负责把DAG图分解成多个Stage,每个Stage,每个Stage中包含多个Task,每个Task会被TaskScheuler分发给各个WorkerNode上的Executor去执行。

《spark的设计与运行原理》 图10

    原文作者:有一束阳光叫温暖
    原文地址: https://www.jianshu.com/p/e9845cac935c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞