- 前言
- Spark 知识系列文章
- 一、RDDd性分布式数据集
- 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
一、RDDd性分布式数据集 1.1 RDD定义以及框架RDD是最基本的逻辑抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合;
图片展示的是用Spark实现WordCount案例,具体实现在Spark 之 Spark框架及部署博文中展示过了;
RDD表示只读的分区的数据集,对RDD进行改动,只能通过RDD的转换 *** 作,由一个RDD得到一个新的RDD,新的RDD包含了从其他RDD衍生所必需的信息。RDDs之间存在依赖,RDD的执行是按照血缘关系延时计算的。如果血缘关系较长,可以通过持久化RDD来切断血缘关系。
1.3 创建RDD在Spark中创建RDD的创建方式可以分为三种:从集合中创建RDD;从外部存储创建RDD;从其他RDD创建(血缘关系)。
1.4 算子解决问题其实是将问题的初始状态通过一系列的 *** 作(Operate)(算子)对问题的状态进行转换,然后达到完成的状态。
Spark中所有的RDD都是算子,但是分为两大类:转换算子,行动算子,在博文Spark 之 RDD转换算子 、 Spark 之 RDD行动算子 中有详细介绍。
1.5 RDD依赖关系RDD只支持粗粒度转换,即在大量记录上执行的单个 *** 作。将创建RDD的一系列Lineage(血统)记录下来,以便恢复丢失的分区。RDD的Lineage会记录RDD的元数据信息和转换行为,当该RDD的部分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的数据分区。
1.5.1 窄依赖窄依赖指的是每一个父RDD的Partition最多被子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数据分区器Spark目前支持Hash分区和Range分区,用户也可以自定义分区,Hash分区为当前的默认分区,Spark中分区器直接决定了RDD中分区的个数、RDD中每条数据经过Shuffle过程属于哪个分区和Reduce的个数;
注意:
(1)只有Key-Value类型的RDD才有分区器的,非Key-Value类型的RDD分区器的值是None;
(2)每个RDD的分区ID范围:0~numPartitions-1,决定这个值是属于那个分区的。
1.7.1 Hash分区HashPartitioner分区的原理:对于给定的key,计算其hashCode,并除以分区的个数取余,如果余数小于0,则用余数+分区的个数(否则加0),最后返回的值就是这个key所属的分区ID。
HashPartitioner分区弊端:可能导致每个分区中数据量的不均匀,极端情况下会导致某些分区拥有RDD的全部数据。
1.7.2 Ranger分区(很少使用)RangePartitioner作用:将一定范围内的数映射到某一个分区内,尽量保证每个分区中数据量的均匀,而且分区与分区之间是有序的,一个分区中的元素肯定都是比另一个分区内的元素小或者大,但是分区内的元素是不能保证顺序的。简单的说就是将一定范围内的数映射到某一个分区内。
二、 累加器因为如果只是简单的遍历RDD中的数据进行求和,我们事先要定义sum = 0之后累加,但是sum在Driver中,当将累加的任务分发给Executor时,每个Executor会进行求和的 *** 作,但是并不会将结果返回到Driver中。
2.1 运用累加器求数据之和 三、 广播变量:分布式只读共享变量 - 调优策略 事先两个RDD的join *** 作;因为join *** 作会做笛卡尔乘积然后进行shuffle *** 作,所以效率会很低;可以用单独的变量list来进行map *** 作,但是需要将Driver中的数据传输到每个Executor中,效率比较低,所以用广播变量,使该变量变成只读共享变量来提高效率。
总结
本文介绍有关Spark的三大数据结构:RDD、广播变量、累加器的知识,如果有不足之处或者表述不当的地方欢迎大家指正。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)