大规模数据处理实战
蔡元楠
Google Brain资深工程师
立即订阅
8411 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 从这里开始,带你走上硅谷一线系统架构师之路
免费
模块一 | 直通硅谷大规模数据处理技术 (3讲)
01 | 为什么MapReduce会被硅谷一线公司淘汰?
02 | MapReduce后谁主沉浮:怎样设计下一代数据处理技术?
03 | 大规模数据处理初体验:怎样实现大型电商热销榜?
模块二 | 实战学习大规模数据处理基本功 (8讲)
04 | 分布式系统(上):学会用服务等级协议SLA来评估你的系统
05 | 分布式系统(下):架构师不得不知的三大指标
06 | 如何区分批处理还是流处理?
07 | Workflow设计模式:让你在大规模数据世界中君临天下
08 | 发布/订阅模式:流处理架构中的瑞士军刀
09 | CAP定理:三选二,架构师必须学会的取舍
10 | Lambda架构:Twitter亿级实时数据分析架构背后的倚天剑
11 | Kappa架构:利用Kafka锻造的屠龙刀
模块三 | 抽丝剥茧剖析Apache Spark设计精髓 (10讲)
12 | 我们为什么需要Spark?
13 | 弹性分布式数据集:Spark大厦的地基(上)
14 | 弹性分布式数据集:Spark大厦的地基(下)
15 | Spark SQL:Spark数据查询的利器
16 | Spark Streaming:Spark的实时流计算API
17 | Structured Streaming:如何用DataFrame API进行实时数据分析?
18 | Word Count:从零开始运行你的第一个Spark应用
19 | 综合案例实战:处理加州房屋信息,构建线性回归模型
20 | 流处理案例实战:分析纽约市出租车载客信息
21 | 深入对比Spark与Flink:帮你系统设计两开花
模块四 | Apache Beam为何能一统江湖 (8讲)
22 | Apache Beam的前世今生
23 | 站在Google的肩膀上学习Beam编程模型
24 | PCollection:为什么Beam要如此抽象封装数据?
25 | Transform:Beam数据转换操作的抽象方法
26 | Pipeline:Beam如何抽象多步骤的数据流水线?
27 | Pipeline I/O: Beam数据中转的设计模式
28 | 如何设计创建好一个Beam Pipeline?
29 | 如何测试Beam Pipeline?
模块五 | 决战 Apache Beam 真实硅谷案例 (7讲)
30 | Apache Beam实战冲刺:Beam如何run everywhere?
31 | WordCount Beam Pipeline实战
32 | Beam Window:打通流处理的任督二脉
33 | 横看成岭侧成峰:再战Streaming WordCount
34 | Amazon热销榜Beam Pipeline实战
35 | Facebook游戏实时流处理Beam Pipeline实战(上)
36 | Facebook游戏实时流处理Beam Pipeline实战(下)
模块六 | 大规模数据处理的挑战与未来 (4讲)
37 | 5G时代,如何处理超大规模物联网数据
38 | 大规模数据处理在深度学习中如何应用?
39 | 从SQL到Streaming SQL:突破静态数据查询的次元
40 | 大规模数据处理未来之路
专栏加餐 | 特别福利 (4讲)
FAQ第一期 | 学习大规模数据处理需要什么基础?
加油站 | Practice makes perfect!
FAQ第二期 | Spark案例实战答疑
FAQ第三期 | Apache Beam基础答疑
结束语 (1讲)
结束语 | 世间所有的相遇,都是久别重逢
大规模数据处理实战
登录|注册

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

蔡元楠 2019-05-17
你好,我是蔡元楠。
上一讲我们介绍了弹性分布式数据集(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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《大规模数据处理实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(26)

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

    作者回复: 👍🏻

    2019-05-17
    1
    25
  • 从目的上来说,checkpoint用于数据恢复,RDD持久化用于RDD的多次计算操作的性能优化,避免重复计算。从存储位置上看checkpoint储存在外存中,RDD可以根据存储级别存储在内存或/和外存中。
    2019-05-17
    7
  • hua168
    老师,我想问下,如果是linux 命令分析单机300G log日志,内存只有16G,怎搞?
    如果用spark思想,,从io读很卡,直接内存爆了。
    如果先分割日志为100份,再用shell,一下10个并发执行,最后结果合并。感觉还是有点慢。

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

    2019-05-17
    6
  • 珅剑
    1.设置checkpoint时需要指定checkpoint的存储目录,而持久化不管是直接调用cache还是通过persist指定缓存级别都不需要指定存储目录,由系统自己指定
    2.checkpoint是将RDD去除依赖关系后将数据直接存储到磁盘,且一般是HDFS,带有备份,因此不容易丢失,恢复时直接获取checkpoint的数据;而持久化一般是直接cache到内存。数据容易丢失,即便是通过设置MEMORY_AND_DISK_2等缓存级别达到内存和磁盘都有备份,也会在每个备份中都缓存RDD的依赖关系,造成不必要的冗余
    2019-06-11
    4
  • Peter
    在计算过程中,对于一些计算过程比较耗时的 RDD,我们可以将它缓存至硬盘或 HDFS 中,标记这个 RDD 有被检查点处理过,并且清空它的所有依赖关系。同时,给它新建一个依赖于 CheckpointRDD 的依赖关系,CheckpointRDD 可以用来从硬盘中读取 RDD 和生成新的分区信息。
    2019-05-18
    2
  • 利利
    1. 前者:persist或者cache除了除了持久化该RDD外,还会保留该RDD前面的依赖关系
    2. 后者:将该RDD保存到磁盘上,并清除前面的依赖关系
    感觉后者的开销会大很多

    作者回复: 理解的很对

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

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

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

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

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

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

    2019-05-17
    2
  • 夜吾夜
    我是否可以这样理解,使用checkpoint,而不是用持久化的RDD来进行数据恢复,是因为当从某一个节点进行回放时,checkpoint的路径比持久化RDD短,更能节省时间,但spark的这种机制也决定了它不支持确定性计算。
    2019-09-25
    1
  • refactor
    cache 和 checkpoint 区别:1.产生过程,cache 是 partition 分区计算完后就执行,而后者是要整个 rdd 计算完再去起新的 job 完成,成本更大;2.执行完后 cache 无论存在内存还是硬盘都会被清理,而 后者不会,除非手动清理;3.cache保存依赖关系,而后者删除所有依赖关系。4.读取一个同时被 cache 和 checkpoint 处理过的 rdd,会先读取前者。
    2019-07-22
    1
  • Peter
    在缓存 RDD 的时候,它所有的依赖关系也会被一并存下来。所以持久化的 RDD 有自动的容错机制。如果 RDD 的任一分区丢失了,通过使用原先创建它的转换操作,它将会被自动重算

    作者回复: 👍🏻

    2019-05-18
    1
  • cricket1981
    RDD的checkpoint会导致写入可靠存储的开销。这可能导致RDD被checkpoint的那些批次的处理时间增加。相反,checkpoint太过不频繁会导致血统链增长和任务大小增加。请问该如何设置合理的checkpoint时间间隔呢?
    2019-05-17
    1
  • jon
    checkpoint不会存储该rdd前面的依赖关系,它后面的rdd都依赖于它。
    persist、 cache操作会存储依赖关系,当一个分区丢失后可以根据依赖重新计算。

    作者回复: 👍🏻

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

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

    2019-05-17
    1
  • 明翼
    checkpoint用的不多,是不是可以对目前所有的rdd均缓存,rdd是针对特定rdd缓存
    2019-05-17
    1
  • 安娜
    如果一个DAG图中出现菱形结构,我持久化会提高效率吗?在一个Action的DAG血缘图里,有个父RDD被两个子RDD依赖。
    2019-08-03
  • 淹死的大虾
    持久化到内存就不说了,用完就没了。和持久化到硬盘比,checkpoint只需要按需在关键节点储存,持久化则所有操作节点都会
    2019-06-24
  • Flash
    检查点是Spark的一个容错机制,应该是会自动缓存那些计算比较耗时的RDD,缓存的是进行计算动作的RDD。
    持久化是Spark针对转换操作的RDD进行缓存,需要开发人员手动调用persist或cache方法。
    2019-06-04
  • 徐宁
    看图一spark sql支持jdbc吗?老师能给个链接不?
    2019-06-01
收起评论
26
返回
顶部