Spark-core:RDD依赖关系、持久化

文章目录

  • 一、RDD血缘关系
  • 二、RDD 依赖关系
    • 1.窄依赖
    • 2.宽依赖
    • 3.RDD的阶段划分
    • 4.RDD任务划分
  • 三、RDD持久化
    • 1.RDD Cache 缓存
    • 2.RDD CheckPoint 检查点
  • 四、RDD 分区器
  • 五、RDD 文件读取与保存


一、RDD血缘关系

RDD不会保存数据;RDD为了提供容错性,会将RDD间的关系保存下来
一旦出现错误,可以根据血缘关系从新计算
Spark-core:RDD依赖关系、持久化_第1张图片

二、RDD 依赖关系

1.窄依赖

上游RDD只被一个下游RDD依赖
Spark-core:RDD依赖关系、持久化_第2张图片

2.宽依赖

宽依赖表示同一个父(上游)RDD 的 Partition 被多个子(下游)RDD 的 Partition 依赖,会引起 Shuffle。

Spark-core:RDD依赖关系、持久化_第3张图片

3.RDD的阶段划分

存在窄依赖的两个RDD一般处于同一阶段中,不存在阶段划分
宽依赖的RDD,会引发Shuffle,需要再两个不同的阶段中进行,
阶段的数量 = 存在shuffle依赖/宽依赖的数量+1(ResultStage阶段)

4.RDD任务划分

RDD 任务切分中间分为:Application、Job、Stage 和 Task

  • Application:初始化一个 SparkContext 即生成一个 Application;
  • Job:一个 Action 算子就会生成一个 Job;
  • Stage:Stage 等于宽依赖(ShuffleDependency)的个数加 1;
  • Task:一个 Stage 阶段中,最后一个 RDD 的分区个数就是 Task 的个数。

Application->Job->Stage->Task 每一层都是 1 对 n 的关系

三、RDD持久化

1.RDD Cache 缓存

由于RDD不存储数据,如果一个RDD需要重复使用,那麽需要从头再执行来获取数据;
所以,RDD 通过 Cache 或者 Persist 方法将前面的计算结果缓存,默认情况下会把数据以缓存在 JVM 的堆内存中。但是并不是这两个方法被调用时立即缓存,而是触发后面的 action 算子时,该 RDD 将会被缓存在计算节点的内存中,并供后面重用。

存储级别
Spark-core:RDD依赖关系、持久化_第4张图片

2.RDD CheckPoint 检查点

通过将 RDD 中间结果写入磁盘
由于血缘依赖过长会造成容错成本过高,这样就不如在中间阶段做检查点容错,如果检查点之后有节点出现问题,可以从检查点开始重做血缘,减少了开销。对 RDD 进行 checkpoint 操作并不会马上被执行,必须执行 Action 操作才能触发。

Cache 缓存、CheckPoint 检查点区别
1.Cache 缓存只是将数据保存起来,不切断血缘依赖。Checkpoint 检查点切断血缘依赖,等同于checkpoint改变了数据源。
2. Cache 缓存的数据通常存储在磁盘、内存等地方,可靠性低。Checkpoint 的数据通常存储在 HDFS 等容错、高可用的文件系统,可靠性高。
3.为了保证数据安全,一般情况下checkpoint会单独执行作业
因此为了提高效率,checkpoint需要和cache联合使用。这样 checkpoint 的 job 只需从 Cache 缓存中读取数据即可,否则需要再从头计算一次 RDD

四、RDD 分区器

Spark 目前支持 Hash 分区和 Range 分区,和用户自定义分区。Hash 分区为当前的默认分区。分区器直接决定了 RDD 中分区的个数、RDD 中每条数据经过 Shuffle 后进入哪个分区,进而决定了 Reduce 的个数。

  • 只有 Key-Value 类型的 RDD 才有分区器,非 Key-Value 类型的 RDD 分区的值是 None
  • 每个 RDD 的分区 ID 范围:0 ~ (numPartitions - 1),决定这个值是属于那个分区的。

Hash 分区:对于给定的 key,计算其 hashCode,并除以分区个数取余
Range 分区:将一定范围内的数据映射到一个分区中,尽量保证每个分区数据均匀,而且分区间有序

五、RDD 文件读取与保存

Spark 的数据读取及数据保存可以从两个维度来作区分:文件格式以及文件系统。
文件格式分为:text 文件、csv 文件、sequence 文件以及 Object 文件;

text 文件:saveAsTextFile()
sequence 文件: Hadoop 用来存储二进制形式的 key-value 对而设计的一种平面文件(Flat File)。在 SparkContext 中,可以调sequenceFile(path)。
Object文件:是将对象序列化后保存的文件,采用 Java 的序列化机制。可以通过 objectFile(path)函数接收一个路径,读取对象文件,返回对应的 RDD,也可以通过调用saveAsObjectFile()实现对对象文件的输出。因为是序列化所以要指定类型。pyspark中无这种文件。

文件系统分为:本地文件系统、HDFS、HBASE 以及数据库。

你可能感兴趣的:(spark总结,spark,java,缓存)