第四节 RDD相干概念
Spark 盘算框架为了可以或许进行高并发和高吞吐的数据处置惩罚,封装了三大数据结构,用于处置惩罚差异的应用场景。三大数据结构分别是:
RDD : 弹性分布式数据集
累加器:分布式共享只写变量
广播变量:分布式共享只读变量
一.什么是 RDD
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是 Spark 中最根本的数据处置惩罚模型。代码中是一个抽象类,它代表一个弹性的、不可变、可分区、内里的元素可并行盘算的集合。
焦点属性
分区列表
RDD 数据结构中存在分区列表,用于实行任务时并行盘算,是实现分布式盘算的紧张属性。
分区盘算函数
Spark 在盘算时,是使用分区函数对每一个分区进行盘算。
RDD 之间的依赖关系
RDD 是盘算模型的封装,当需求中需要将多个盘算模型进行组合时,就需要将多个 RDD 建立依赖关系。
分区器
当数据为 K-V 类型数据时,可以通过设定分区器自定义数据的分区。
首选位置(可选)
盘算数据时,可以根据盘算节点的状态选择差异的节点位置进行盘算。
实行原理
Spark 框架在实行时,先申请资源,然后将应用程序的数据处置惩罚逻辑分解成一个一个的盘算任务。然后将任务发到已经分配资源的盘算节点上, 按照指定的盘算模型进行数据盘算。末了得到盘算效果。
RDD 是 Spark 框架中用于数据处置惩罚的焦点模型,接下来我们看看,在 Yarn 环境中,RDD的工作原理:
启动 Yarn 集群环境
Spark 通过申请资源创建调度节点和盘算节点
Spark 框架根据需求将盘算逻辑根据分区划分成差异的任务
调度节点将任务根据盘算节点状态发送到对应的盘算节点进行盘算
二.RDD 序列化
1) 闭包检查
2) 序列化方法和属性
3) Kryo 序列化框架
注意:即使使用 Kryo 序列化,也要继承 Serializable 接口。
三.RDD 依赖关系
1) RDD 血缘关系
2) RDD 依赖关系
3) RDD 窄依赖
4) RDD 宽依赖
5) RDD 阶段划分
6) RDD 任务划分
Application:初始化一个 SparkContext 即天生一个 Application;
Job:一个 Action 算子就会天生一个 Job;
Stage:Stage 即是宽依赖(ShuffleDependency)的个数加 1;
Task:一个 Stage 阶段中,末了一个 RDD 的分区个数就是 Task 的个数
四.RDD 持久化
1) RDD Cache 缓存
2) RDD CheckPoint 检查点
3) 缓存和检查点区别
五.RDD 分区器
Spark 目前支持 Hash 分区和 Range 分区,和用户自定义分区。Hash 分区为当前的默认分区。分区器直接决定了 RDD 中分区的个数、RDD 中每条数据颠末 Shuffle 后进入哪个分区,进而决定了 Reduce 的个数。
只有 Key-Value 类型的 RDD 才有分区器,非 Key-Value 类型的 RDD 分区的值是 None
每个 RDD 的分区 ID 范围:0 ~ (numPartitions - 1),决定这个值是属于那个分区的。
- Hash 分区:对于给定的 key,盘算其 hashCode,并除以分区个数取余。
- Range 分区:将肯定范围内的数据映射到一个分区中,尽量保证每个分区数据匀称,而且分区间有序
六.RDD 文件读取与生存
Spark 的数据读取及数据生存可以从两个维度来作区分:文件格式以及文件系统。
文件格式分为:text 文件、csv 文件、sequence 文件以及 Object 文件;
文件系统分为:本地文件系统、HDFS、HBASE 以及数据库。
text 文件
sequence 文件
object 对象文件
Spark运行架构
运行架构
Spark 框架的焦点是一个盘算引擎,整体来说,它采用了尺度 master-slave 的结构。
一.焦点组件
由上图可以看出,对于 Spark 框架有两个焦点组件:
(1)Driver
Spark 驱动器节点,用于实行 Spark 任务中的 main 方法,负责现实代码的实行工作。
Driver 在 Spark 作业实行时紧张负责:
将用户程序转化为作业(job)
在 Executor 之间调度任务(task)
跟踪 Executor 的实行环境
通过 UI 展示查询运行环境
(2)Executor
Spark Executor 是集群中工作节点(Worker)中的一个 JVM 历程,负责在 Spark 作业中运行具体任务(Task),任务彼此之间相互独立。Spark 应用启动时,Executor 节点被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在。如果有 Executor 节点发生了故障或崩溃,Spark 应用也可以继续实行,会将出错节点上的任务调度到其他 Executor 节点上继续运行。
Executor 有两个焦点功能:
负责运行构成 Spark 应用的任务,并将效果返回给驱动器历程
它们通过自身的块管理器(Block Manager)为用户程序中要求缓存的 RDD 提供内存式存储。RDD 是直接缓存在 Executor 历程内的,因此任务可以在运行时充分利用缓存数据加速运算。Master & Worker
Spark 集群的独立部署环境中,不需要依赖其他的资源调度框架,自身就实现了资源调度的功能,所以环境中还有其他两个焦点组件:Master 和 Worker,这里的 Master 是一个历程,紧张负责资源的调度和分配,并进行集群的监控等职责,类似于 Yarn 环境中的 RM, 而Worker 呢,也是历程,一个 Worker 运行在集群中的一台服务器上,由 Master 分配资源对数据进行并行的处置惩罚和盘算,类似于 Yarn 环境中 NM。
ApplicationMaster
Hadoop 用户向 YARN 集群提交应用程序时,提交程序中应该包含 ApplicationMaster,用于向资源调度器申请实行任务的资源容器 Container,运行用户本身的程序任务 job,监控整个任务的实行,跟踪整个任务的状态,处置惩罚任务失败等异常环境。
说的简单点就是,ResourceManager(资源)和 Driver(盘算)之间的解耦合靠的就是ApplicationMaster。
二.焦点概念
Executor 与 Core
Spark Executor 是集群中运行在工作节点(Worker)中的一个 JVM 历程,是整个集群中的专门用于盘算的节点。在提交应用中,可以提供参数指定盘算节点的个数,以及对应的资源。这里的资源一样平常指的是工作节点 Executor 的内存大小和使用的假造 CPU 核(Core)数量。
并行度(Parallelism)
有向无环图(DAG)
大数据盘算引擎框架我们根据使用方式的差异一样平常会分为四类,此中第一类就是Hadoop 所承载的 MapReduce,它将盘算分为两个阶段,分别为 Map 阶段 和 Reduce 阶段。
这里所谓的有向无环图,并不是真正意义的图形,而是由 Spark 程序直接映射成的数据流的高级抽象模型。简单明白就是将整个程序盘算的实行过程用图形表示出来,如许更直观,更便于明白,可以用于表示程序的拓扑结构。
DAG有向无环图是由点和线构成的拓扑图形,该图形具有方向,不会闭环。
三.提交流程
所谓的提交流程,实在就是开发人员根据需求写的应用程序通过 Spark 客户端提交给 Spark 运行环境实行盘算的流程。在差异的部署环境中,这个提交过程根本相同,但是又有细微的区别,这里不进行详细的比较,但是因为国内工作中,将 Spark 引用部署到Yarn 环境中会更多一些,所以这里提到的提交流程是基于 Yarn 环境的。
Spark 应用程序提交到 Yarn 环境中实行的时间,一样平常会有两种部署实行的方式:Client和 Cluster。两种模式紧张区别在于:Driver 程序的运行节点位置。
Yarn Client 模式
Client 模式将用于监控和调度的 Driver 模块在客户端实行,而不是在 Yarn 中,所以一样平常用于测试。
Driver 在任务提交的本地机器上运行
Driver 启动后会和 ResourceManager 通讯申请启动 ApplicationMaster
ResourceManager 分配 container,在合适的 NodeManager 上启动 ApplicationMaster,负责向 ResourceManager 申请 Executor 内存
ResourceManager 接到 ApplicationMaster 的资源申请后会分配 container,然后ApplicationMaster 在资源分配指定的 NodeManager 上启动 Executor 历程
Executor 历程启动后会向 Driver 反向注册,Executor 全部注册完成后 Driver 开始实行main 函数
之后实行到 Action 算子时,触发一个 Job,并根据宽依赖开始划分 stage,每个 stage 天生对应的 TaskSet,之后将 task 分发到各个 Executor 上实行。
Yarn Cluster 模式
Cluster 模式将用于监控和调度的 Driver 模块启动在 Yarn 集群资源中实行。一样平常应用于现实生产环境。
在 YARN Cluster 模式下,任务提交后会和 ResourceManager 通讯申请启动ApplicationMaster。
随后 ResourceManager 分配 container,在合适的 NodeManager 上启动 ApplicationMaster,此时的 ApplicationMaster 就是 Driver。
Driver 启动后向 ResourceManager 申请 Executor 内存,ResourceManager 接到ApplicationMaster 的资源申请后会分配 container,然后在合适的 NodeManager 上启动Executor 历程。
Executor 历程启动后会向 Driver 反向注册,Executor 全部注册完成后 Driver 开始实行main 函数。
之后实行到 Action 算子时,触发一个 Job,并根据宽依赖开始划分 stage,每个 stage 天生对应的 TaskSet,之后将 task 分发到各个 Executor 上实行。
创建spark实现的WordCount程序
在pom.xml中添加依赖
创建Spark-core子模块
将spark-core当中的java文件夹重定名为scala。
在scala文件夹中创建Scala的object程序。
编写wordCount的spark程序
在Spark-core中创建名为input的文件夹,在此文件夹中创建word.txt文件,并在文件中添加需要进行统计的语句。
运行编写好的WordCount程序
配置日志文件
配置完成后重新实行代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |