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

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

宽依赖
窄依赖
并行操作
不可变性
分区
RDD基于分布式内存的数据抽象
提出新的分布式存储方案
传统MapReduce框架的性能瓶颈
依赖关系
Partitioner
Partitions
SparkConf
SparkContext
RDD的定义
为什么需要新的数据抽象模型?
总结
思考题
RDD的结构
RDD的设计思想和特性
弹性分布式数据集

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

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

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

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

RDD 的定义

弹性分布式数据集是英文直译的名字,乍一看这个名字相信你会不知所云。如果你去 Google 或者百度搜索它的定义,你会得到如下结果:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Spark的弹性分布式数据集(RDD)是Spark的基本数据抽象,通过分布式内存的数据抽象和并行操作,大大提高了计算效率。相较于传统的MapReduce框架,RDD在数据处理效率、并行处理和容错性方面都有显著提升,使得Spark更加可靠。RDD具有复杂的结构,包括分区、Partitioner、Dependencies等组件,支持窄依赖和宽依赖,从而实现了并行处理和失败恢复。深入研究RDD的容错机制、任务执行机制以及各种转换与动作操作,将有助于更全面地理解Spark的弹性分布式数据集。同时,对于窄依赖的理解也需要进一步探讨,特别是子RDD中的一个分区是否可以对应父RDD中的若干个分区的情况。这些问题的讨论将有助于读者更好地理解和应用RDD的特性。

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

全部留言(34)

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

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

    2019-05-15
    6
    67
  • 追梦
    老师,下面这句话对吗? 一个stage的所有task都执行完毕之后,会在各个节点本地的磁盘文件中写入计算中间结果,然后Driver就会调度运行下一个stage。下一个stage的task的输入数据就是上一个stage输出的中间结果。 说明:spark的中间计算结果会直接落到磁盘上的???

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

    2019-05-16
    4
    4
  • 吟游雪人
    新的RDD不就是上一步的RDD计算出的结果么?为什么说是不保存计算结果?

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

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

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

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

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

    2019-05-16
    1
  • 明翼
    rdd的分区不保存数据什么意思?老师可以对rdd结构再深入讲解不?我认为子rdd在窄依赖中不会对应多个父rdd,才保障单向传递

    作者回复: 就是说,分区本身不会存储数据,它只是有一个指向真正存储数据位置的reference。

    2019-05-15
    1
  • 我想还可以算做是窄依赖,因为子RDD分区所依赖的对个父RDD分区是互斥的,所以每个子RDD分区所依赖的多个父RDD分区可以被看做一组分区。父RDD的组分区与子分区是一一对应关系,满足窄依赖可以并行计算,而无需所以父分区都计算完毕才可以开始计算的特性。

    作者回复: 👍🏻

    2019-05-15
    2
    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
  • hua168
    老师,hadoop计算框架Map/Reduce 过时了,那另一个存储框架HDFS,也过时了吗? 现在我看很多云提供商都是对象存储实现海量需求, 现在开源的分布式存储,能在生产环境使用的,用什么了,ceph?

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

    2019-05-16
  • 木卫六
    1.窄依赖是指父 RDD 的每一个分区都可以唯一对应子 RDD 中的分区,那么是否意味着子 RDD 中的一个分区只可以对应父 RDD 中的一个分区呢? 不是的,比如coalesce这种合并分区的操作中,子rdd需要依赖父rdd的若干个分区,但它不需要全部的分区,是窄依赖 2.如果子 RDD 的一个分区需要由父 RDD 中若干个分区计算得来,是否还算窄依赖? 算。只要纪录层级没发生重新分区,全局混洗,应该都属于窄依赖吧

    作者回复: 正确!

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