Spark基本架构及运行原理

Spark软件栈

这里写图片描述

  • Spark Core:

包含Spark的基本功能,包含任务调度,内存管理,容错机制等,内部定义了RDDs(弹性分布式数据集),提供了很多APIs来创建和操作这些RDDs。为其他组件提供底层的服务。

  • Spark SQL:

Spark处理结构化数据的库,就像Hive SQL,Mysql一样,企业中用来做报表统计。

  • Spark Streaming:

实时数据流处理组件,类似Storm。Spark Streaming提供了API来操作实时流数据。企业中用来从Kafka接收数据做实时统计。

  • MLlib:

一个包含通用机器学习功能的包,Machine learning lib包含分类,聚类,回归等,还包括模型评估和数据导入。MLlib提供的上面这些方法,都支持集群上的横向扩展。

  • Graphx:

处理图的库(例如,社交网络图),并进行图的并行计算。像Spark Streaming,Spark SQL一样,它也继承了RDD API。它提供了各种图的操作,和常用的图算法,例如PangeRank算法。

Spark提供了全方位的软件栈,只要掌握Spark一门编程语言就可以编写不同应用场景的应用程序(批处理,流计算,图计算等)。Spark主要用来代替Hadoop的MapReduce部分。

Hadoop MapReduce缺点:

  1. 表达能力有限
  2. 磁盘IO开销大,任务之间的衔接涉及IO开销
  3. 延迟高,Map任务要全部结束,reduce任务才能开始。

Spark借鉴Hadoop MapReduce优点的同时,解决了MapReuce所面临的问题,有如下优点:

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

Spark运行架构及流程

这里写图片描述

基本概念:

  • Application:用户编写的Spark应用程序。
  • Driver:Spark中的Driver即运行上述Application的main函数并创建SparkContext,创建SparkContext的目的是为了准备Spark应用程序的运行环境,在Spark中有SparkContext负责与ClusterManager通信,进行资源申请、任务的分配和监控等,当Executor部分运行完毕后,Driver同时负责将SparkContext关闭。
  • Executor:是运行在工作节点(WorkerNode)的一个进程,负责运行Task。
  • RDD:弹性分布式数据集,是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型。
  • DAG:有向无环图,反映RDD之间的依赖关系。
  • Task:运行在Executor上的工作单元。
  • Job:一个Job包含多个RDD及作用于相应RDD上的各种操作。
  • Stage:是Job的基本调度单位,一个Job会分为多组Task,每组Task被称为Stage,或者也被称为TaskSet,代表一组关联的,相互之间没有Shuffle依赖关系的任务组成的任务集。
  • Cluter Manager:指的是在集群上获取资源的外部服务。目前有三种类型
    1) Standalon : spark原生的资源管理,由Master负责资源的分配
    2) Apache Mesos:与hadoop MR兼容性良好的一种资源调度框架
    3) Hadoop Yarn: 主要是指Yarn中的ResourceManager

一个Application由一个Driver和若干个Job构成,一个Job由多个Stage构成,一个Stage由多个没有Shuffle关系的Task组成。

当执行一个Application时,Driver会向集群管理器申请资源,启动Executor,并向Executor发送应用程序代码和文件,然后在Executor上执行Task,运行结束后,执行结果会返回给Driver,或者写到HDFS或者其它数据库中。

与Hadoop MapReduce计算框架相比,Spark所采用的Executor有两个优点:

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

Spark运行基本流程:

这里写图片描述

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

Spark运行架构特点:

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

RDD

一个RDD就是一个分布式对象集合,本质上是一个只读的分区记录集合,每个RDD可分成多个分区,每个分区就是一个数据集片段,并且一个RDD的不同分区可以被保存到集群中不同的节点上,从而可以在集群的不同节点上进行并行计算。

RDD提供了一种高端受限的共享内存模型,即RDD是只读的记录分区的集合,不能直接修改,只能基于稳定的物理存储中的数据集创建RDD,或者通过在其他RDD上执行确定的转换操作(如map,join和group by)而创建得到新的RDD。

RDD执行过程:

  1. RDD读入外部数据源进行创建
  2. RDD经过一系列的转换(Transformation)操作,没一次都会产生不同的RDD供下一个转换操作使用
  3. 最后一个RDD经过“动作”操作进行转换并输出到外部数据源

优点:惰性调用、管道化、避免同步等待,不需要保存中间结果。这和Java8中Stream的概念极其类似。
这里写图片描述
RDD特性

  1. 高效的容错性,根据DAG图恢复分区,数据复制或者记录日志
    RDD血缘关系、重新计算丢失分区、无需回滚系统、重算过程在不同节点之间并行、只记录粗粒度的操作
  2. 中间结果持久化到内存,数据在内存中的多个RDD操作之间进行传递,避免了不必要的读写磁盘开销
  3. 存放的数据可以是Java对象,避免了不必要的对象序列化和反序列化

窄依赖和宽依赖

  • 窄依赖:表现为一个父RDD的分区对应于一个子RDD的分区或者多个父RDD的分区对应于一个子RDD的分区。
  • 宽依赖:表现为存在一个父RDD的一个分区对应一个子RDD的多个分区。
    这里写图片描述

Stage的划分

Spark通过分析各个RDD的依赖关系生成了DAG,在通过分析各个RDD中的分区之间的依赖关系来决定如何划分Stage。具体划分方法如下:

  • 在DAG中进行反向解析,遇到宽依赖就断开,遇到窄依赖就把当前的RDD加入到Stage中;
  • 将窄依赖尽量划分在同一个Stage中,可以实现流水线计算
    这里写图片描述

此文主要参考厦门大学Spark基础教程

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页