Spark
- 前言
- Spark 知识系列文章
- 一、RDD弹性分布式数据集
- 1.1 RDD定义以及框架
- 1.2 特点
- 1.3 创建RDD
- 1.4 算子
- 1.5 RDD依赖关系
- 1.5.1 窄依赖
- 1.5.2 宽依赖
- 1.6 RDD任务划分
- 1.7 RDD数据分区器
- 1.7.1 Hash分区
- 1.7.2 Ranger分区(很少使用)
- 二、 累加器
- 2.1 运用累加器求数据之和
- 三、 广播变量:分布式只读共享变量 - 调优策略
- 总结
前言
本文介绍有关Spark的三大数据结构:RDD、广播变量、累加器的相关知识。
Spark 知识系列文章
此处罗列了有关Spark相关知识的其他文章,有需要的可以进行点击查阅。
Spark 之 Spark框架及部署
Spark 之 RDD转换算子
Spark 之 RDD行动算子
Spark 之 SparkSQL
Spark 之 SparkStreaming
一、RDD弹性分布式数据集
1.1 RDD定义以及框架
最基本的逻辑抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合;
图片展示的是用Spark实现WordCount案例,具体实现在Spark 之 Spark框架及部署博文中展示过了;
1.2 特点
只读的分区的数据集,对RDD进行改动,只能通过RDD的转换操作,由一个RDD得到一个新的RDD,新的RDD包含了从其他RDD衍生所必需的信息。RDDs之间存在依赖,RDD的执行是按照血缘关系延时计算的。如果血缘关系较长,可以通过持久化RDD来切断血缘关系。
1.3 创建RDD
从集合中创建RDD;从外部存储创建RDD;从其他RDD创建(血缘关系)。
1.4 算子
解决问题其实是将问题的初始状态通过一系列的操作(Operate)(算子)对问题的状态进行转换,然后达到完成的状态。
Spark中所有的RDD都是算子,但是分为两大类:转换算子,行动算子,在博文Spark 之 RDD转换算子 、 Spark 之 RDD行动算子 中有详细介绍。
1.5 RDD依赖关系
粗粒度转换,即在大量记录上执行的单个操作。将创建RDD的一系列Lineage(血统)记录下来,以便恢复丢失的分区。RDD的Lineage会记录RDD的元数据信息和转换行为,当该RDD的部分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的数据分区。
1.5.1 窄依赖
最多被子RDD的一个Partition使用
1.5.2 宽依赖
多个子RDD的Partition会依赖同一个父RDD的Partition,会引起shuffle
1.6 RDD任务划分
RDD任务切分中间分为:Application、Job、Stage和Task
1)Application:初始化一个SparkContext即生成一个Application
2)Job:一个Action算子就会生成一个Job
3)Stage:根据RDD之间的依赖关系的不同将Job划分成不同的Stage,遇到一个宽依赖则划分一个Stage。(stage 个数 = 1 + shuffle的个数)
4)Task:Stage是一个TaskSet,将Stage划分的结果发送到不同的Executor执行即为一个Task。一般来说,一个阶段的任务个数取决于阶段最后一步的分区个数,分区有几个就会有几个任务。
注意:Application->Job->Stage-> Task每一层都是1对n的关系。
1.7 RDD数据分区器
Hash分区为当前的默认分区,Spark中分区器直接决定了RDD中分区的个数、RDD中每条数据经过Shuffle过程属于哪个分区和Reduce的个数;
注意:
(1)只有Key-Value类型的RDD才有分区器的,非Key-Value类型的RDD分区器的值是None;
(2)每个RDD的分区ID范围:0~numPartitions-1,决定这个值是属于那个分区的。
1.7.1 Hash分区
分区的个数取余,如果余数小于0,则用余数+分区的个数(否则加0),最后返回的值就是这个key所属的分区ID。
弊端:可能导致每个分区中数据量的不均匀,极端情况下会导致某些分区拥有RDD的全部数据。
1.7.2 Ranger分区(很少使用)
RangePartitioner作用:将一定范围内的数映射到某一个分区内,尽量保证每个分区中数据量的均匀,而且分区与分区之间是有序的,一个分区中的元素肯定都是比另一个分区内的元素小或者大,但是分区内的元素是不能保证顺序的。简单的说就是将一定范围内的数映射到某一个分区内。
二、 累加器
返回到Driver中。
2.1 运用累加器求数据之和
三、 广播变量:分布式只读共享变量 - 调优策略
广播变量,使该变量变成只读共享变量来提高效率。
总结
本文介绍有关Spark的三大数据结构:RDD、广播变量、累加器的知识,如果有不足之处或者表述不当的地方欢迎大家指正。