大数据-Spark(七)

                                    大数据-Spark(七)

RDD的依赖关系

RDD和它依赖的父RDD的关系有两种不同的类型,窄依赖(narrow dependency)和宽依赖(wide dependency)。

  • 窄依赖 :窄依赖指的是每一个父RDD的Partition最多被子RDD的一个Partition使用。map/flatMap/filter/union等这些算子操作是窄依赖,所有的窄依赖不会产生shuffle。
  • 宽依赖 :宽依赖指的是多个子RDD的Partition会依赖同一个父RDD的Partition。reduceByKey/sortByKey/groupBy/groupByKey/join等这些算子操作是宽依赖,所有的宽依赖会产生shuffle。
  •  补充说明:由上图可知,join分为宽依赖和窄依赖,如果RDD有相同的partitioner,那么将不会引起shuffle,这种join是窄依赖,反之就是宽依赖。

lineage(血统)

  • RDD只支持粗粒度转换,即只记录单个块上执行的单个操作。
  • 将创建RDD的一系列Lineage(即血统)记录下来,以便恢复丢失的分区。
  • RDD的Lineage会记录RDD的元数据信息和转换行为,lineage保存了RDD的依赖关系,当该RDD的部分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的数据分区。

RDD的缓存机制

什么是rdd的缓存

可以把一个rdd的数据缓存起来,后续有其他的job需要用到该rdd的结果数据,可以直接从缓存中获取得到,避免了重复计算。缓存是加快后续对该数据的访问操作。

如何对rdd设置缓存

rdd通过persist方法或cache方法可以将前面的计算结果缓存。但是并不是这两个方法被调用时立即缓存,而是==触发后面的action==时,该RDD将会被缓存在计算节点的内存中,并供后面重用。

通过查看源码发现cache最终也是调用了persist方法,默认的存储级别都是仅在内存存储一份,Spark的存储级别还有好多种,存储级别在object StorageLevel中定义的。 

cache和persist区别

  • cache:   默认是把数据缓存在内存中,其本质就是调用persist方法;
  • persist:可以把数据缓存在内存或者是磁盘,有丰富的缓存级别,这些缓存级别都被定义在StorageLevel这个object中。

什么时候设置缓存

  • 某个rdd的数据后期被使用了多次

如上图所示的计算逻辑: 

(1)当第一次使用rdd2做相应的算子操作得到rdd3的时候,就会从rdd1开始计算,先读取HDFS上的文件,然后对rdd1 做对应的算子操作得到rdd2,再由rdd2计算之后得到rdd3。同样为了计算得到rdd4,前面的逻辑会被重新计算。

(2)默认情况下多次对一个rdd执行算子操作, rdd都会对这个rdd及之前的父rdd全部重新计算一次。 这种情况在实际开发代码的时候会经常遇到,但是我们一定要避免一个rdd重复计算多次,否则会导致性能急剧降低。   

总结:可以把多次使用到的rdd,也就是公共rdd进行持久化,避免后续需要,再次重新计算,提升效率。

  • 为了获取得到一个rdd的结果数据,经过了大量的算子操作或者是计算逻辑比较复杂

清除缓存数据

  • 自动清除:一个application应用程序结束之后,对应的缓存数据也就自动清除。
  • 手动清除:调用rdd的unpersist方法。

RDD的checkpoint机制

checkpoint概念

checkpoint 检查点 ,它是提供了一种相对而言更加可靠的数据持久化方式。它是把数据保存在分布式文件系统,比如HDFS上。这里就是利用了HDFS高可用性,高容错性(多副本)来最大程度保证数据的安全性。

如何设置checkpoint

1.在hdfs上设置一个checkpoint目录

sc.setCheckpointDir("hdfs://node01:8020/checkpoint")

2.对需要做checkpoint操作的rdd调用checkpoint方法  

val rdd1=sc.textFile("/words.txt")
rdd1.checkpoint
val rdd2=rdd1.flatMap(_.split(" ")) 

3.最后需要有一个action操作去触发任务的运行

rdd2.collect

cache、persist、checkpoint三者区别

  • cache和persist

    • cache默认数据缓存在内存中
    • persist可以把数据保存在内存或者磁盘中
    • 后续要触发 cache 和 persist 持久化操作,需要有一个action操作
    • 它不会开启其他新的任务,一个action操作就对应一个job
    • 它不会改变rdd的依赖关系,程序运行完成后对应的缓存数据就自动消失
  • checkpoint

    • 可以把数据持久化写入到hdfs上
    • 后续要触发checkpoint持久化操作,需要有一个action操作,后续会开启新的job执行checkpoint操作
    • 它会改变rdd的依赖关系,后续数据丢失了不能够在通过血统进行数据的恢复。
    • 程序运行完成后对应的checkpoint数据就不会消失
sc.setCheckpointDir("/checkpoint")
val rdd1=sc.textFile("/words.txt")
val rdd2=rdd1.cache
rdd2.checkpoint
val rdd3=rdd2.flatMap(_.split(" "))
rdd3.collect

checkpoint操作要执行需要有一个action操作,一个action操作对应后续的一个job。该job执行完成之后,它会再次单独开启另外一个job来执行 rdd1.checkpoint操作。

对checkpoint在使用的时候进行优化,在调用checkpoint操作之前,可以先来做一个cache操作,缓存对应rdd的结果数据,后续就可以直接从cache中获取到rdd的数据写入到指定checkpoint目录中。

此博文仅供学习参考,如有错误欢迎指正。

上一篇《大数据-Spark(六)

下一篇《大数据-Spark(八)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值