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 icberger 数据类型 spark的基本数据类型_spark icberger 数据类型


  图片展示的是用Spark实现WordCount案例,具体实现在Spark 之 Spark框架及部署博文中展示过了;

1.2 特点

只读的分区的数据集,对RDD进行改动,只能通过RDD的转换操作,由一个RDD得到一个新的RDD,新的RDD包含了从其他RDD衍生所必需的信息。RDDs之间存在依赖,RDD的执行是按照血缘关系延时计算的。如果血缘关系较长,可以通过持久化RDD来切断血缘关系。

1.3 创建RDD

从集合中创建RDD;从外部存储创建RDD;从其他RDD创建(血缘关系)。

spark icberger 数据类型 spark的基本数据类型_big data_02

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 icberger 数据类型 spark的基本数据类型_数据结构_03

三、 广播变量:分布式只读共享变量 - 调优策略

广播变量,使该变量变成只读共享变量来提高效率。

spark icberger 数据类型 spark的基本数据类型_spark_04


总结

本文介绍有关Spark的三大数据结构:RDD、广播变量、累加器的知识,如果有不足之处或者表述不当的地方欢迎大家指正。