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

你好,我是蔡元楠。
上一讲我们介绍了弹性分布式数据集(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
- 深入了解
- 翻译
- 解释
- 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《大规模数据处理实战》,新⼈⾸单¥59
《大规模数据处理实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(32)
- 最新
- 精选
- 锦区别在于Checkpoint会清空该RDD的依赖关系,并新建一个CheckpointRDD依赖关系,让该RDD依赖,并保存在磁盘或HDFS文件系统中,当数据恢复时,可通过CheckpointRDD读取RDD进行数据计算;持久化RDD会保存依赖关系和计算结果至内存中,可用于后续计算。
作者回复: 👍🏻
462 - RocWay主要区别应该是对依赖链的处理: checkpoint在action之后执行,相当于事务完成后备份结果。既然结果有了,之前的计算过程,也就是RDD的依赖链,也就不需要了,所以不必保存。 但是cache和persist只是保存当前RDD,并不要求是在action之后调用。相当于事务的计算过程,还没有结果。既然没有结果,当需要恢复、重新计算时就要重放计算过程,自然之前的依赖链不能放弃,也需要保存下来。需要恢复时就要从最初的或最近的checkpoint开始重新计算。
作者回复: 这位同学的理解是很准确的
30 - hua168老师,我想问下,如果是linux 命令分析单机300G log日志,内存只有16G,怎搞? 如果用spark思想,,从io读很卡,直接内存爆了。 如果先分割日志为100份,再用shell,一下10个并发执行,最后结果合并。感觉还是有点慢。
作者回复: 如果限定为单机处理,我觉得你的第二个思路是可行的,第一个行不通。
27 - JohnT3e两者区别在于依赖关系是否保留吧。checkpoint的话,检查点之前的关系应该丢失了,但其数据已经持久化了;而persist或者cache保留了这个依赖关系,如果缓存结果有丢失,可以通过这个关系进行rebuild。
作者回复: 这位同学的理解很准确
25 - 挖矿的小戈1. 前者:persist或者cache除了除了持久化该RDD外,还会保留该RDD前面的依赖关系 2. 后者:将该RDD保存到磁盘上,并清除前面的依赖关系 感觉后者的开销会大很多
作者回复: 理解的很对
4 - miwucc手动调用缓存函数和checkpoint本质上是一样的吧。就是一个手动控制落盘时间,一个自动控制。
作者回复: 并不是,checkpoint会将一些RDD的结果存入硬盘,但是不会保留依赖关系;缓存函数或者持久化处理会保留依赖关系,所以错误恢复会更方便。
3 - 廖师虎记不太清除了,checkpoint清除血缘关系,一般保存在类hdfs文件系统,目的是容错,缓存是保留血缘关系,并保存在本机,的目的是提高效率,High performance Spark书讲得很详细。 第一次遇到把driver翻译成驱动程序的,个人感觉还是保留Driver,Action为佳。
作者回复: 翻译也是为了方便英文不好的同学理解,但是每个名次第一次出现我都会标出英文。
3 - Steven缓存了之后,第一个action还是需要从头计算的吧? "所以无论是 count 还是 first,Spark 都无需从头计算", 这句话是不是有误?
作者回复: 你的观察很仔细,这里确实是笔误。持久化处理过的RDD只有第一次有action操作时才会从源头计算,之后就把结果存储下来。所以在这个例子中Count需要从源头开始计算,而first不需要。
32 - joncheckpoint不会存储该rdd前面的依赖关系,它后面的rdd都依赖于它。 persist、 cache操作会存储依赖关系,当一个分区丢失后可以根据依赖重新计算。
作者回复: 👍🏻
2 - cricket1981终于明白spark惰性求值的原理了。我理解对 RDD 进行持久化操作和记录 Checkpoint的区别是:前者是开发人员为了避免重复计算、减少长链路计算时间而主动去缓存中间结果,而后者是spark框架为了容错而提供的保存中间结果机制,它对开发人员是透明的,无感知的。
作者回复: 这些机制对开发者并不是透明的,开发者可以手动调用checkpoint和cache方法来存储RDD。他们的主要区别是是否存储依赖关系。
2
收起评论