Spark运行架构
运行架构
Spark 框架的核心是一个计算引擎,整体来说,它采用了标准 master-slave 的结构
核心组件
Driver和Spark驱动节点器是park 框架有两个核心组件
Spark 驱动器节点,用于执行 Spark 任务中的 main 方法,负责实际代码的执行工作
Driver主要负责 :将用户程序转化为作业(job)、在 Executor 之间调度任务(task)、
跟踪 Executor 的执行情况、通过 UI 展示查询运行情况
Executor:
Spark Executor 是集群中工作节点(Worker)中的一个 JVM 进程,负责在 Spark 作业中运行具体任务(Task),任务彼此之间相互独立。
Executor 两个核心功能:
1.负责运行组成 Spark 应用的任务,并将结果返回给驱动器进程
2.它们通过自身的块管理器(Block Manager)为用户程序中要求缓存的 RDD 提供内存式存储
Master & Worker
Master 是一个进程,主要负责资源的调度和分配,并进行集群的监控等职责
Worker 也是进程,一个 Worker 运行在集群中的一台服务器上,由 Master 分配资源对数据进行并行的处理和计算
ApplicationMaster
用于向资源调度器申请执行任务的资源容器 Container,运行用户自己的程序任务 job,监控整个任务的执行,跟踪整个任务的状态,处理任务失败等异常情况
核心概念
Executor 与 Core
Spark Executor 是集群中运行在工作节点(Worker)中的一个 JVM 进程,是整个集群中的专门用于计算的节点。在提交应用中,可以提供参数指定计算节点的个数,以及对应的资源
注:这里的资源一般指的是工作节点 Executor 的内存大小和使用的虚拟 CPU 核(Core)数量
并行度
是并行,而不是并发
有向无环图(DAG):由 Spark 程序直接映射成的数据流的高级抽象模型
整个程序计算的执行过程用图形表示出来,这样更直观,更便于理解,可以用于表示程序的拓扑结构
DAG(Directed Acyclic Graph)有向无环图是由点和线组成的拓扑图形,该图形具有方向,不会闭环
提交流程
RDD相关概念
什么是 RDD
RDD:弹性分布式数据集,是 Spark 中最基本的数据处理模型。代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合
1)弹性
存储的弹性:内存与磁盘的自动切换;
容错的弹性:数据丢失可以自动恢复;
计算的弹性:计算出错重试机制;
分片的弹性:可根据需要重新分片。
2)分布式:数据存储在大数据集群不同节点上
3)数据集:RDD 封装了计算逻辑,并不保存数据
4)数据抽象:RDD 是一个抽象类,需要子类具体实现
5)不可变:RDD 封装了计算逻辑,是不可以改变的,想要改变,只能产生新的 RDD,在新的 RDD 里面封装计算逻辑
6) 可分区、并行计算
核心属性
分区列表:RDD 数据结构中存在分区列表,用于执行任务时并行计算,是实现分布式计算的重要属性
分区计算函数:Spark 在计算时,是使用分区函数对每一个分区进行计算
RDD 之间的依赖关系:RDD 是计算模型的封装,当需求中需要将多个计算模型进行组合时,就需要将多个 RDD 建立依赖关系
分区器(可选):当数据为 K-V 类型数据时,可以通过设定分区器自定义数据的分区
首选位置(可选):计算数据时,可以根据计算节点的状态选择不同的节点位置进行计算
执行原理
Spark 框架在执行时,先申请资源,然后将应用程序的数据处理逻辑分解成一个一个的计算任务。然后将任务发到已经分配资源的计算节点上, 按照指定的计算模型进行数据计算。最后得到计算结果
在yarn中工作原理
1.启动 Yarn 集群环境
2.Spark 通过申请资源创建调度节点和计算节点
3.Spark 框架根据需求将计算逻辑根据分区划分成不同的任务
4.调度节点将任务根据计算节点状态发送到对应的计算节点进行计算
RDD 在整个流程中主要用于将逻辑进行封装,并生成 Task 发送给Executor 节点执行计算
RDD 序列化
1.闭包检查
2.序列化方法和属性
3.Kryo 序列化框架
注意:即使使用 Kryo 序列化,也要继承 Serializable 接口
RDD 依赖关系
1.RDD 血缘关系:RDD 只支持粗粒度转换,即在大量记录上执行的单个操作。将创建 RDD 的一系列 Lineage(血统)记录下来,以便恢复丢失的分区
2.RDD 依赖关系:这里所谓的依赖关系,其实就是两个相邻 RDD 之间的关系。包括打印依赖、shuffle依赖等
3.RDD 窄依赖:窄依赖表示每一个父(上游)RDD 的 Partition 最多被子(下游)RDD 的一个 Partition 使用,窄依赖我们形象的比喻为独生子女
4.RDD 宽依赖:宽依赖表示同一个父(上游)RDD 的 Partition 被多个子(下游)RDD 的 Partition 依赖,会引起 Shuffle,总结:宽依赖我们形象的比喻为多生
5.RDD 阶段划分:DAG(Directed Acyclic Graph)有向无环图是由点和线组成的拓扑图形,该图形具有方向,不会闭环
6.RDD 任务划分:RDD 任务切分中间分为:Application、Job、Stage 和 Task
注意:Application->Job->Stage->Task 每一层都是 1 对 n 的关系
RDD 持久化
1.RDD Cache 缓存:RDD 通过 Cache 或者 Persist 方法将前面的计算结果缓存,默认情况下会把数据以缓存在 JVM 的堆内存中
2. RDD CheckPoint 检查点
缓存和检查点区别:
1)Cache 缓存只是将数据保存起来,不切断血缘依赖。Checkpoint 检查点切断血缘依赖
2)Cache 缓存的数据通常存储在磁盘、内存等地方,可靠性低。Checkpoint 的数据通常存储在 HDFS 等容错、高可用的文件系统,可靠性高
3)建议对 checkpoint()的 RDD 使用 Cache 缓存,这样 checkpoint 的 job 只需从 Cache 缓存中读取数据即可,否则需要再从头计算一次 RDD
RDD 分区器
只有 Key-Value 类型的 RDD 才有分区器,非 Key-Value 类型的 RDD 分区的值是 None
每个 RDD 的分区 ID 范围:0 ~ (numPartitions - 1),决定这个值是属于那个分区的
- Hash 分区:对于给定的 key,计算其 hashCode,并除以分区个数取余
- Range 分区:将一定范围内的数据映射到一个分区中,尽量保证每个分区数据均匀,而且分区间有序
RDD 文件读取与保存
Spark 的数据读取及数据保存可以从两个维度来作区分:文件格式以及文件系统
文件格式分为:text 文件、csv 文件、sequence 文件以及 Object 文件;
文件系统分为:本地文件系统、HDFS、HBASE 以及数据库
Spark-Core编程
创建spark实现的WordCount程序
实例:
创建maven项目:
.在pom.xml中添加依赖
创建子模块
创建object程序,并编写
在子文件中创建一个文件夹 ,在文件夹中创建word.txt文件,并在文件中添加需要进行统计的语句
运行编写的项目:
创建RDD
从集合(内存)中创建 RDD
运行结果: