Spark Core

发布于:2025-04-10 ⋅ 阅读:(76) ⋅ 点赞:(0)

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),决定这个值是属于那个分区的

  1. Hash 分区:对于给定的 key,计算其 hashCode,并除以分区个数取余
  2. Range 分区:将一定范围内的数据映射到一个分区中,尽量保证每个分区数据均匀,而且分区间有序

RDD 文件读取与保存

Spark 的数据读取及数据保存可以从两个维度来作区分:文件格式以及文件系统

文件格式分为:text 文件、csv 文件、sequence 文件以及 Object 文件;

文件系统分为:本地文件系统、HDFS、HBASE 以及数据库

Spark-Core编程

创建spark实现的WordCount程序

实例:

创建maven项目:

.在pom.xml中添加依赖

创建子模块

创建object程序,并编写

在子文件中创建一个文件夹 ,在文件夹中创建word.txt文件,并在文件中添加需要进行统计的语句

运行编写的项目:

创建RDD

从集合(内存)中创建 RDD

运行结果:


网站公告

今日签到

点亮在社区的每一天
去签到