Spark 之Spark三大数据结构


前言

本文介绍有关Spark的三大数据结构:RDD、广播变量、累加器的相关知识。


Spark 知识系列文章

   此处罗列了有关Spark相关知识的其他文章,有需要的可以进行点击查阅。

   Spark 之 Spark框架及部署

   Spark 之 RDD转换算子

   Spark 之 RDD行动算子

   Spark 之 SparkSQL

   Spark 之 SparkStreaming

一、RDD弹性分布式数据集

1.1 RDD定义以及框架

  RDD是最基本的逻辑抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合;

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

1.2 特点

  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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值