大规模数据处理实战
蔡元楠
Google Brain资深工程师
立即订阅
8449 人已学习
课程目录
已完结 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讲)
结束语 | 世间所有的相遇,都是久别重逢
大规模数据处理实战
登录|注册

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

蔡元楠 2019-05-15
你好,我是蔡元楠。
今天我要与你分享的主题是“弹性分布式数据集”。
上一讲中提到,Spark 最基本的数据抽象是弹性分布式数据集(Resilient Distributed Dataset, 下文用 RDD 代指)。
Spark 基于 RDD 定义了很多数据操作,从而使得数据处理的代码十分简洁、高效。所以,要想深入学习 Spark,我们必须首先理解 RDD 的设计思想和特性。

为什么需要新的数据抽象模型?

传统的 MapReduce 框架之所以运行速度缓慢,很重要的原因就是有向无环图的中间计算结果需要写入硬盘这样的稳定存储介质中来防止运行结果丢失。
而每次调用中间计算结果都需要要进行一次硬盘的读取,反复对硬盘进行读写操作以及潜在的数据复制和序列化操作大大提高了计算的延迟。
因此,很多研究人员试图提出一个新的分布式存储方案,不仅保持之前系统的稳定性、错误恢复和可扩展性,还要尽可能地减少硬盘 I/O 操作。
一个可行的设想就是在分布式内存中,存储中间计算的结果,因为对内存的读写操作速度远快于硬盘。而 RDD 就是一个基于分布式内存的数据抽象,它不仅支持基于工作集的应用,同时具有数据流模型的特点。

RDD 的定义

弹性分布式数据集是英文直译的名字,乍一看这个名字相信你会不知所云。如果你去 Google 或者百度搜索它的定义,你会得到如下结果:
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《大规模数据处理实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(27)

  • Milittle
    对于思考题:需要重点理解原文中这句话:
    窄依赖就是父 RDD 的分区可以一一对应到子 RDD 的分区,宽依赖就是父 RDD 的每个分区可以被多个子 RDD 的分区使用。
    这句话说明了,窄依赖的父RDD必须有一个对应的子RDD,也就是说父RDD的一个分区只能被子RDD一个分区使用,但是反过来子RDD的一个分区可以使用父RDD的多个分区。那就回复今天的思考题,第一个疑问窄依赖子RDD的分区不一定只对应父RDD的一个分区,只要满足被子RDD分区利用的父RDD分区不被子RDD的其他分区利用就算窄依赖。第二个疑问其实上面已经做了回答,只有当子RDD分区依赖的父RDD分区不被其他子RDD分区依赖,这样的计算就是窄依赖,否则是宽依赖。
    最后,总结以下,就是只有父RDD的分区被多个子RDD的分区利用的时候才是宽依赖,其他的情况就是窄依赖。如果有哪里理解不对的地方,请老师指正,谢谢~

    作者回复: 你说的很准确!点赞

    2019-05-15
    1
    29
  • windcaller
    窄:一子多父,一子一父
    宽:一父多子
    2019-07-26
    3
  • 吟游雪人
    新的RDD不就是上一步的RDD计算出的结果么?为什么说是不保存计算结果?

    作者回复: 不保存计算结果指的是不写入硬盘。像MapReduce中每一步中间计算结果都要写入HDFS。新的RDD是上一步RDD计算的结果,但是并没有立刻进行计算,看过下一讲就明白了,只有碰到action操作才会开始执行,而且如果没有进行特别的缓存或者持久化操作,结果只在内存中,没有被写入硬盘,所以说不保存结果。

    2019-05-16
    1
    2
  • 老师好!能不能请老师讲讲Spark和Flink的对比呢?这二者谁在机器学习乃至深度学习中更有优势呢?

    作者回复: 你好,在第21讲我会带大家比较Spark和Flink。

    2019-05-15
    2
  • 渡码
    思考题:
    如果子RDD依赖多个父RDD的多个完整分区,也就是说不存在父RDD一个分区数据分到子RDD多个分区的情况,那就是窄依赖。因为此时父RDD不需要对key重新做分区计算,子RDD也不需要等父RDD所有分区计算完毕。
    2019-05-21
    1
  • 追梦
    老师,下面这句话对吗?
    一个stage的所有task都执行完毕之后,会在各个节点本地的磁盘文件中写入计算中间结果,然后Driver就会调度运行下一个stage。下一个stage的task的输入数据就是上一个stage输出的中间结果。

    说明:spark的中间计算结果会直接落到磁盘上的???

    作者回复: 不对,Spark的中间计算结果如果没有特别指定持久化到硬盘,都会存在内存里以方便下一次调用,这也是它运行速度比MapReduce快的主要原因。

    2019-05-16
    1
    1
  • Little Spirits
    多个父分区到一个子分区,对于任何一个父分区而言都是pipeline的所以是窄依赖,而一个父分区到多个子分区对父分区而言不是pipeline的所以是宽依赖

    作者回复: 建议看一下高赞的回答,那位同学的理解要更加全面

    2019-05-16
    1
  • miwucc
    子rdd依赖多个父rdd来产出结果。明显是宽依赖。因为需要等待多个父rdd结果完毕才能开始计算。宽依赖还是窄依赖关键看是否要等待更多父rdd准备完毕。
    2019-05-15
    1
  • 文中提到依赖关系的区分考虑基于两点:
    1、性能考虑,窄依赖可以使得每个数据节点并行计算结果,也可以支持链式计算;宽依赖需要父分区的中每个分区中的数据节点计算,只能串行计算。
    2、故障恢复考虑,窄依赖可以更快、更准的恢复数据,宽依赖则相对较慢。
    那么基于以上考虑,父rdd与子rdd是多对多的关系,则划分到宽依赖;一对一、一对多或多对一的关系都可以划分到窄依赖。

    分区方式:hash分区、rang分区,以及自定义分区
    疑问:因为分区指向某个节点中的数据块,那么分区的key是分区在RDD中的index还是其引用的数据块中的某个数据字段?我认为是后者。
    另外,hash分区和rang分区的应用场景分别是什么呢?

    RDD具有不可变性,只能通过转换来创建新的RDD,但是不代表RDD中分区指向的节点数据块也不可变,那么如何保证数据块不可变性呢?我认为可能是使用CopyOnWrite技术实现的。

    Spark优于MapReduce的地方之一在于:MapReduce的中间计算结果实时落盘,而Spark使用存储依赖关系和延迟存储中间数据来提高性能。
    2019-05-15
    1
  • Rainbow
    uion也是窄依赖
    2019-05-15
    1
  • 桂浩晋
    RDD的每个partition有没有replication?万一node挂了怎么办?
    2019-10-04
    1
  • kissrain
    之前查阅了很多资料都没有一个对RDD完整解释或者说的很模糊。老师的这篇文章真是一针见血,越是厉害的人越是能把原理说的越通俗易懂。
    2019-09-09
  • hel
    新RDD的分区数可以不和父RDD的分区数想等吗
    2019-07-18
    1
  • 心灵捕手
    老师问下,
    lines = sc.textFile("data.txt")
    lineLengths = lines.map(lambda s: len(s))
    totalLength = lineLengths.reduce(lambda a, b: a + b)
    这个代码直接在spark上运行,报错<console>:1: error: ')' expected but '(' found.
    val lineLengths = lines.map(lambda s: len(s))
    2019-06-27
  • dancer
    这里有个疑惑希望老师解答。spark每一个子rdd的都会记录他和父rdd分区的依赖关系,所以不需要持久化到磁盘。那么我理解所有这必须依赖于父rdd也要一直保存在内存中才可以。如果是这样的话,是不是spark需要保存所有步骤产生的rdd在内存中。 另外如果所有数据都保存在内存中,如果机器故障,该怎样恢复数据呢?感谢老师用来答疑的宝贵时间。
    2019-06-16
    1
  • Geek_f406a1
    窄依赖并不是完全的父子RDD一一对应,子RDD可以对应多个父RDD,父RDD只能对应一个RDD?是否可以这样理解
    2019-05-30
    1
  • lwenbin
    思考题答案应该算narrow partition.
    看了spark rdd论文,对老师说的这些概念有了新的认识。
    narrow partition对应的转换例如:map, filter, join(子分区join key都在一个分区), union. 其中join和union就对应了老师说的子分区来自于多个父分区。
    区别在于wide partition有shuffle过程,存在对于同一个父分区中两个record, 经过转换操作后会对应到两个不同的子分区,所以这些操作例如:groupByKey, 通常的join。

    作者回复: 说的对。查阅paper是一个很好的学习方法,给你点赞。

    2019-05-20
  • “在物理存储中,每个分区指向一个存放在内存或者硬盘中的数据块”,老师,这一句不太理解,每个分区指向数据块,可是前文说到分区在逻辑上是一个数组,那数组怎么能指向数据块呢?
    2019-05-17
  • hua168
    老师,hadoop计算框架Map/Reduce 过时了,那另一个存储框架HDFS,也过时了吗?
    现在我看很多云提供商都是对象存储实现海量需求,
    现在开源的分布式存储,能在生产环境使用的,用什么了,ceph?

    作者回复: HDFS我认为并没有过时,现在大部分分布式计算引擎还是与HDFS存储的数据进行交互。分布式存储系统有很多比如Amazon的Dynamo DB,Facebook曾经用的HBase等等。开源的话我没有用过很多,ceph听说还不错。

    2019-05-16
  • 一修💤
    请教老师一个问题,现在有个inference任务使用hadoop streaming,1000个mapper并行执行,没有reducer,需要为每个mapper载入模型 词典等文件,如果改用spark,能否实现多个RDD读取同一块内存的模型和词典,达到节省内存的效果? 还望老师答复
    2019-05-15
收起评论
27
返回
顶部