运行架构
|
Spark 框架的核心是一个计算引擎,整体来说,它采用了标准 master-slave 的结构。 |
它展示了一个 Spark 执行时的基本结构。图形中的 Driver 表示 master,负责管理整个集群中的作业任务调度。图形中的 Executor 则是 slave,负责实际执行任务 |
|
Driver、Spark 驱动器节点,用于执行 Spark 任务中的 main 方法,负责实际代码的执行工作。 |
|
Driver 在 Spark主要负责
将用户程序转化为作业(job) |
在 Executor 之间调度任务(task) |
跟踪 Executor 的执行情况 |
通过 UI 展示查询运行情况 |
Driver 就是驱使整个应用运行起来的程序,也称之为Driver 类。
Spark Executor 是集群中工作节点(Worker)中的一个 JVM 进程,负责在 Spark 作业中运行具体任务(Task),任务彼此之间相互独立。会将出错节点上的任务调度到其他 Executor 节点上继续运行。
Executor核心:
负责运行组成 Spark 应用的任务,并将结果返回给驱动器进程 |
它们通过自身的块管理器(Block Manager)为用户程序中要求缓存的 RDD 提供内存式存储。可以在运行时充分利用缓存数据加速运算。 |
Spark 集群的独立部署环境中
两个核心组件:Master 是一个进程,主要负责资源的调度和分配,并进行集群的监控等职责。Worker 运行在集群中的一台服务器上,由 Master 分配资源对数据进行并行的处理和计算
ResourceManager(资源)和 Driver(计算)之间的解耦合靠的就是ApplicationMaster。
核心:Spark Executor 是集群中运行在工作节点(Worker)中的一个 JVM 进程,是整个集群中的专门用于计算的节点。Executor 的内存大小和使用的虚拟 CPU 核(Core)数量。
并行度(Parallelism)
整个集群并行执行任务的数量称之为并行度。
有向无环图(DAG)
一类就是Hadoop 所承载的 MapReduce,它将计算分为两个阶段,分别为 Map 阶段 和 Reduce 阶段。
DAG(Directed Acyclic Graph)有向无环图是由点和线组成的拓扑图形,该图形具有方向,不会闭环。
提交流程
Spark 引用部署到Yarn 环境中会更多一些,所以这里提到的提交流程是基于 Yarn 环境的。
第四节 RDD相关概念
三大数据结构:
RDD : 弹性分布式数据集 |
累加器:分布式共享只写变量 |
广播变量:分布式共享只读变量 |
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是 Spark 中最基本的数据处理模型。弹性的、不可变、可分区、里面的元素可并行计算的集合。
弹存 |
储的弹性:内存与磁盘的自动切换; |
容错的弹性:数据丢失可以自动恢复; |
计算的弹性:计算出错重试机制; |
分片的弹性:可根据需要重新分片。 |
分布式:数据存储在大数据集群不同节点上 |
数据集:RDD 封装了计算逻辑,并不保存数据 |
数据抽象:RDD 是一个抽象类,需要子类具体实现 |
不可变:RDD 封装了计算逻辑,是不可以改变的,想要改变,只能产生新的 RDD,在新的 RDD 里面封装计算逻辑 |
可分区、并行计算 |
核心属性
分区列表 |
RDD 数据结构中存在分区列表,用于执行任务时并行计算,是实现分布式计算的重要属性。 |
分区计算函数 |
Spark 在计算时,是使用分区函数对每一个分区进行计算。 |
RDD 之间的依赖关系 |
RDD 是计算模型的封装,当需求中需要将多个计算模型进行组合时,就需要将多个 RDD 建立依赖关系。 |
分区器(可选) |
当数据为 K-V 类型数据时,可以通过设定分区器自定义数据的分区。 |
首选位置(可选) |
计算数据时,可以根据计算节点的状态选择不同的节点位置进行计算。 |
执行原理
将计算资源和计算模型进行协调和整合
RDD的工作原理如下:
启动 Yarn 集群环境 |
Spark 通过申请资源创建调度节点和计算节点 |
Spark 框架根据需求将计算逻辑根据分区划分成不同的任务 |
调度节点将任务根据计算节点状态发送到对应的计算节点进行计算 |
主要用于将逻辑进行封装,并生成 Task 发送给Executor 节点执行计算。 |
RDD 序列化 |
|
|
|
使用 Kryo 序列化,也要继承 Serializable 接口 |
RDD 依赖关系
RDD 血缘关系:信息来重新运算和恢复丢失的数据分区 |
RDD 依赖关系:两个相邻 RDD 之间的关系 |
RDD 窄依赖:比喻为独生子女 |
RDD 宽依赖:宽依赖我们形象的比喻为多生 |
RDD 阶段划分:DAG(Directed Acyclic Graph)有向无环图是由点和线组成的拓扑图形,该图形具有方向,不会闭环 |
RDD 任务划分:Application:初始化一个 SparkContext 即生成一个 Application; Job:一个 Action 算子就会生成一个 Job; Stage:Stage 等于宽依赖(ShuffleDependency)的个数加 1; Task:一个 Stage 阶段中,最后一个 RDD 的分区个数就是 Task 的个数。 注意:Application->Job->Stage->Task 每一层都是 1 对 n 的关系。 |
RDD 持久化
RDD Cache 缓存 |
RDD CheckPoint 检查点 RDD 进行 checkpoint 操作并不会马上被执行,必须执行 Action 操作才能触发。 |
缓存和检查点区别 Cache 缓存只是将数据保存起来,不切断血缘依赖。Checkpoint 检查点切断血缘依赖 Cache 缓存的数据通常存储在磁盘、内存等地方,可靠性低。 checkpoint()的 RDD 使用 Cache 缓存, |
RDD 分区器
Key-Value 类型的 RDD 才有分区器,非 Key-Value 类型的 RDD 分区的值是 None |
每个 RDD 的分区 ID 范围:0 ~ (numPartitions - 1),决定这个值是属于那个分区的。 |
Hash 分区:对于给定的 key,计算其 hashCode,并除以分区个数取余。 |
Range 分区:将一定范围内的数据映射到一个分区中,尽量保证每个分区数据均匀,而且分区间有序 |
RDD 文件读取与保存’
文件格式分为:text 文件、csv 文件、sequence 文件以及 Object 文件; |
文件系统分为:本地文件系统、HDFS、HBASE 以及数据库。 |
text 文件 |
sequence 文件 |
object 对象文件 |