大规模数据处理实战
蔡元楠
硅谷资深工程师
41608 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 46 讲
大规模数据处理实战
15
15
1.0x
00:00/00:00
登录|注册

14 | 弹性分布式数据集:Spark大厦的地基(下)

CountByKey
Count
Reduce
Collect
groupByKey
mapPartitions
Filter
Map
迭代函数(Iterator)
存储级别(Storage Level)
检查点(Checkpoint)
思考题
RDD的持久化(缓存)
RDD的动作操作
RDD的转换操作
RDD的结构
弹性分布式数据集

该思维导图由 AI 生成,仅供参考

你好,我是蔡元楠。
上一讲我们介绍了弹性分布式数据集(RDD)的定义、特性以及结构,并且深入讨论了依赖关系(Dependencies)。
今天让我们一起来继续学习 RDD 的其他特性。

RDD 的结构

首先,我来介绍一下 RDD 结构中其他的几个知识点:检查点(Checkpoint)、存储级别( Storage Level)和迭代函数(Iterator)。
通过上一讲,你应该已经知道了,基于 RDD 的依赖关系,如果任意一个 RDD 在相应的节点丢失,你只需要从上一步的 RDD 出发再次计算,便可恢复该 RDD。
但是,如果一个 RDD 的依赖链比较长,而且中间又有多个 RDD 出现故障的话,进行恢复可能会非常耗费时间和计算资源。
而检查点(Checkpoint)的引入,就是为了优化这些情况下的数据恢复。
很多数据库系统都有检查点机制,在连续的 transaction 列表中记录某几个 transaction 后数据的内容,从而加快错误恢复。
RDD 中的检查点的思想与之类似。
在计算过程中,对于一些计算过程比较耗时的 RDD,我们可以将它缓存至硬盘或 HDFS 中,标记这个 RDD 有被检查点处理过,并且清空它的所有依赖关系。同时,给它新建一个依赖于 CheckpointRDD 的依赖关系,CheckpointRDD 可以用来从硬盘中读取 RDD 和生成新的分区信息。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了弹性分布式数据集(RDD)的结构和特性,包括RDD的持久化和缓存操作,以及其与记录Checkpoint的区别。文章首先详细介绍了RDD的结构,包括检查点、存储级别和迭代函数,强调了转换操作和动作操作的区别,以及Spark的惰性求值设计优势。接着,文章重点讲解了RDD的持久化操作,通过示例代码展示了如何提高Spark的计算效率,同时提及了持久化的存储级别选择和自动容错机制。此外,文章还总结了Spark在转换操作和动作操作中的计算逻辑链条,以及通过持久化处理提升计算效率的方法。最后,文章提出了思考题,引发读者对RDD的持久化操作和记录Checkpoint的区别进行思考和讨论。整体而言,本文通过详细介绍RDD的结构和操作,帮助读者快速了解了RDD的基本概念和使用方法,同时突出了Spark在计算效率和容错机制方面的优势。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《大规模数据处理实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(32)

  • 最新
  • 精选
  • 区别在于Checkpoint会清空该RDD的依赖关系,并新建一个CheckpointRDD依赖关系,让该RDD依赖,并保存在磁盘或HDFS文件系统中,当数据恢复时,可通过CheckpointRDD读取RDD进行数据计算;持久化RDD会保存依赖关系和计算结果至内存中,可用于后续计算。

    作者回复: 👍🏻

    2019-05-17
    4
    62
  • RocWay
    主要区别应该是对依赖链的处理: checkpoint在action之后执行,相当于事务完成后备份结果。既然结果有了,之前的计算过程,也就是RDD的依赖链,也就不需要了,所以不必保存。 但是cache和persist只是保存当前RDD,并不要求是在action之后调用。相当于事务的计算过程,还没有结果。既然没有结果,当需要恢复、重新计算时就要重放计算过程,自然之前的依赖链不能放弃,也需要保存下来。需要恢复时就要从最初的或最近的checkpoint开始重新计算。

    作者回复: 这位同学的理解是很准确的

    2019-05-17
    30
  • hua168
    老师,我想问下,如果是linux 命令分析单机300G log日志,内存只有16G,怎搞? 如果用spark思想,,从io读很卡,直接内存爆了。 如果先分割日志为100份,再用shell,一下10个并发执行,最后结果合并。感觉还是有点慢。

    作者回复: 如果限定为单机处理,我觉得你的第二个思路是可行的,第一个行不通。

    2019-05-17
    2
    7
  • JohnT3e
    两者区别在于依赖关系是否保留吧。checkpoint的话,检查点之前的关系应该丢失了,但其数据已经持久化了;而persist或者cache保留了这个依赖关系,如果缓存结果有丢失,可以通过这个关系进行rebuild。

    作者回复: 这位同学的理解很准确

    2019-05-17
    2
    5
  • 挖矿的小戈
    1. 前者:persist或者cache除了除了持久化该RDD外,还会保留该RDD前面的依赖关系 2. 后者:将该RDD保存到磁盘上,并清除前面的依赖关系 感觉后者的开销会大很多

    作者回复: 理解的很对

    2019-05-17
    4
  • miwucc
    手动调用缓存函数和checkpoint本质上是一样的吧。就是一个手动控制落盘时间,一个自动控制。

    作者回复: 并不是,checkpoint会将一些RDD的结果存入硬盘,但是不会保留依赖关系;缓存函数或者持久化处理会保留依赖关系,所以错误恢复会更方便。

    2019-05-17
    3
  • 廖师虎
    记不太清除了,checkpoint清除血缘关系,一般保存在类hdfs文件系统,目的是容错,缓存是保留血缘关系,并保存在本机,的目的是提高效率,High performance Spark书讲得很详细。 第一次遇到把driver翻译成驱动程序的,个人感觉还是保留Driver,Action为佳。

    作者回复: 翻译也是为了方便英文不好的同学理解,但是每个名次第一次出现我都会标出英文。

    2019-05-17
    3
  • Steven
    缓存了之后,第一个action还是需要从头计算的吧? "所以无论是 count 还是 first,Spark 都无需从头计算", 这句话是不是有误?

    作者回复: 你的观察很仔细,这里确实是笔误。持久化处理过的RDD只有第一次有action操作时才会从源头计算,之后就把结果存储下来。所以在这个例子中Count需要从源头开始计算,而first不需要。

    2019-05-17
    3
    2
  • jon
    checkpoint不会存储该rdd前面的依赖关系,它后面的rdd都依赖于它。 persist、 cache操作会存储依赖关系,当一个分区丢失后可以根据依赖重新计算。

    作者回复: 👍🏻

    2019-05-17
    2
  • cricket1981
    终于明白spark惰性求值的原理了。我理解对 RDD 进行持久化操作和记录 Checkpoint的区别是:前者是开发人员为了避免重复计算、减少长链路计算时间而主动去缓存中间结果,而后者是spark框架为了容错而提供的保存中间结果机制,它对开发人员是透明的,无感知的。

    作者回复: 这些机制对开发者并不是透明的,开发者可以手动调用checkpoint和cache方法来存储RDD。他们的主要区别是是否存储依赖关系。

    2019-05-17
    2
收起评论
显示
设置
留言
32
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部