Spark RDD

1、课程目标

  • 1、掌握RDD的原理

  • 2、熟练使用RDD的算子来完成计算任务

  • 3、掌握RDD的宽窄依赖

  • 4、掌握RDD的缓存机制

  • 5、掌握划分stage

2、RDD的概述

  • 1、什么是RDD

    • RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。

      • Dataset

        • 它表示RDD就是一个数据集合,里面存放着很多的数据

      • Distributed

        • RDD的数据是分布式存储的,有助于分布式计算

      • Resilient

        • 弹性的 —-> 它表示RDD中的数据是可以保存在内存中或者是磁盘里

3、RDD的五大属性

  • A list of partitions

         一组分区列表

  • A function for computing each split

         作用在每一个分区中函数

  • A list of dependencies on other RDDs

          一个rdd会依赖于其他多个rdd, spark的容错机制就是根据这个特性而来的

  • Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)

         (可选项) 针对于KV类型的RDD才会有分区函数(只要发生shuffle) ,它决定数据的来源和数据去向

  • Optionally, a list of preferred locations to compute each split on (e.g. block locations foran HDFS file)

        (可选项)一组最优的数据块位置 数据本地性和数据最优。

 4、创建RDD

* 1、由一个已经存在的scala集合
* val rdd1 = sc.parallelize(Array(1,2,3,4,5,6,7,8))
* 2、通过sparkContext调用textFile读取外部数据源
* val rdd2=sc.textFile(“/words.txt”)
* 3、通过已经存在RDD经过算子操作之后生成新的RDD
* val rdd3=rdd2.flatMap(_.split(” “))

 5、RDD的算子分类

* Transformation(转换)
* 一个RDD进行操作之后生成一个新RDD;它是延迟加载,并不会立即执行,它只是记录下了作用在RDD上的一系列操作。
* Action(动作)
* 它是一个动作,会触发整个任务真正的运行。

6、RDD的依赖关系

* 窄依赖
* 父RDD的每一个partition最多只被子RDD的一个partition所使用
* 比喻为:独生子女
* 宽依赖
* 子RDD多个partition会依赖父RDD同一个partition
* 比喻为:超生

 7、lineage(血统)

* 会记录下当前RDD上元数据信息,以及对应作用在rdd上的转换行为。如果当前某一个RDD某个分区数据丢失之后,它是可以通过血统进行恢复。

8、RDD的缓存机制

* cache
* 针对于需要缓存的RDD调用cache方法,默认将数据缓存在内存中,但并不是执行cache操作之后就进行缓存,而是需要后面有action操作。其本质是调用了persist方法。
* persist
* 有丰富的缓存级别。可以通过调用RDD.persist(StorageLevel.缓存级别)
* 删除缓存数据
* rdd.unpersist(boolean)
* ture 表示阻塞一直等待缓存数据被删除
* false 表示不阻塞,边删除边进行下面的相关操作

 9、checkpoint机制

* Checkpoint是为了相对而言更加可靠的持久化数据.可以将需要持久化的数据保存在HDFS上
* 如何设置checkpoint
* 利用sc.setCheckpointDir(HDFS目录)
* 针对于需要持久的RDD调用checkpoint方法
* rdd.checkpoint
* 后面也需要触发action的算子操作
* cache、persist、checkpoint区别
* 1、都可以缓存数据
* 2、cache其本质是调用了persist方法,默认是将数据缓存在内存中
* 3、persist有着丰富的缓存级别,这些缓存级别都在 Storagelevel这个object中
* 4、checkpoint执行后,生成了一个新的RDD为checkpointRDD,此时RDD的依赖关系已经发生改变,如果数据丢失了,是不可以通过重新计算恢复得到。而cache和persist它们的lineage血统是没有发生改变,数据丢失后还是可以重新计算得到。
* 5、数据丢失后,恢复的顺序
* 先在cache里查找,有就直接获取得到,如果没有设置cache,去checkpoint中查找,如果也没有设置checkpoint,这个时候只能否重新计算得到。

 

版权声明:本文为scls原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/scls/p/8969917.html