一、Spark简介
- spark的特点
(1) 运行速度快
使用DAG执行引擎以支持循环数据流与内存计算
(2) 容易使用
支持使用Scala、Java、Python和R语言进行编程,可以通过Spark Shell 进行交互式编程
(3) 通用性
Spark提供了完整而强大的技术栈,包括SQL查询,流式计算,机器学习和图算法组件
(4) 运行模式多样
可以运行独立的集群模型种,可运行于Hadooo中,也运行于Amazon EC2等云环境中,并且可以访问HDFS、Cassandra、HBase、Hive等多种数据源。
- Spark与Hadoop的对比
图1(1) Spark的计算模型也属于MapReduce,但不局限于Map和Reduce操作,还可以提供了多种数据集操作类型,编程模型比Hadoop MapReduce更灵活
(2)Spark提供了内存计算,可以将中间结果放到内存中,对于迭代运行效率更高。
(3)Spark基于DAG的任务调度执行机制,要要优于Hadoop MapReduce的迭代执行机制
二、Spark生态系统
Spark生态系统已经成为伯克利数据分析软件栈BDAS(Berkeley Data Analytics Stack)的重要组成部分
图2Spark的生态系统主要包含了Spark Core、Spark SQL、Spark Streaming、MLLib和GraphX等组件。
Spark生态系统组件的应用场景
图3
三、Spark运行框架
- 基本概念
(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架构设计
-
Spark运行架构包括集群资源管理器(Cluster Manager)、运行作业任务的工作节点(Worker Node)、每个应用的任务控制节点(Driver)和每个工作节点上负责具体任务的执行进行(Executor)
资源管理器可以自带或Mesos或YARN -
Spark所采用的Executor有两个优点:
1.利用多线程来执行具体的任务,减少任务的启动开销
2.Executor中有一个BlockManager存储模块,会将内存和磁盘共同作为存储设备,有效减少IO开销
图4 -
一个Application由一个Driver和若干个Job构成,一个Job由多个Stage构成,一个Stage由多个没有Shuffle关系的Task组成。
当执行一个Application时,Driver会向集群管理器申请资源,启动Executor,并向Executor发送应用程序代码和文件,然后在Executor上执行Task,运行结果后,执行结果会返回给Driver,或者写到HDFS或者其他数据库中
- Spark运行基本流程
图6(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运行架构具有一下特点:
(1)每个Application都有自己专属的Executor进程,并且该进程在Application运行期间一直驻留。Executor进程以多线程的方式运行Task
(2) Spark运行过程与资源管理器无关,只要能够获取Executor进程并保持通信即可。
(3) Task采用了数据本地性和推测执行等优化机制。
四、RDD概念原理
- RDD概念
(1)一个RDD就是一个分布式对象集合,本质上是一个只读的分区记录集合,每个RDD可分成多个分区,每个分区就是一个数据集片段,并且一个RDD的不同分区可以被保存到集群中不同的节点上,从而可以在集群中不同节点上进行并行计算
(2) RDD提供了一组丰富的操作以支持常见的数据运算,分为"Action"和"Transformation"两种类型。
- RDD特性
(1) 高效的容错性
现有容错机制:数据负责或者记录日志。
RDD:血缘关系、重新计算丢失分区、无需回滚系统、重算过程在不同节点之间并行、只记录粗粒度的操作
(2) 中间结果持久化到内存,数据在内存中的多个RDD操作之间进行传递,避免了必要的读写磁盘开销
(3) 存放的数据可以是Java对象,避免了不必要的对象序列化和反序列化
- RDD之间的依赖关系
(1) 窄依赖
图7窄依赖表现为一个父RDD的分区对应一个子RDD的分区或多个父RDD的分区对应一个子RDD的分区
(2) 宽依赖
图8宽依赖则表现为存在一个父RDD的一个分区对应一个子RDD的多个分区
- Stage划分
(1) 在DAG中进行反向解析,遇到宽依赖就断开
(2) 遇到窄依赖就把当前的RDD加入到Stage中
(3) 将窄依赖尽量划分到同一个Stage中,可以实现流水线计算
DAGScheduler的stage划分算法总结:会从触发action操作的那个rdd开始反向解析,首先会为最后一个rdd创建一个stage,反向解析的时候,遇到窄依赖就把当前的rdd加入到Stage,遇到宽依赖就断开,将宽依赖的那个rdd创建一个新的stage,那个rdd就是这个stage最后一个rdd。依此类推,遍历所有RDD为止。
- RDD运行过程
RDD在Spark架构中的运行过程
(1)创建RDD对象
(2)SparkContext负责计算RDD之间的依赖关系,构建RDD;
(3)DAGScheduler负责把DAG图分解成多个Stage,每个Stage,每个Stage中包含多个Task,每个Task会被TaskScheuler分发给各个WorkerNode上的Executor去执行。
网友评论