Spark学习笔记(2) - 关于SaprkRDD基本原理的个人理解 ⭐️⭐️⭐️

第二章 - SparkCore RDD


Read Me

  • 📖 Code : 本章节代码实现
  • 🏠 CSDN : wangt的博客
  • ☁️ Github : https://github.com/lovewangtzq
  • ❤️ 微信公众号 : 大数据初学者
  • 🍻 b站: 我学不会Spark

RDD的基本概念 📖

  • RDD 为什么会产生

    • 归根结底其实是 我们需要一个 迭代计算和有效数据共享的模型,但是 MR 无法满足需求,因为Hadoop进行迭代计算的效率很低.它的数据是基于磁盘存储的,数据只能通过磁盘共享 并且每一次迭代时需要从磁盘中读取数据 这样效率其实很低 ,并且迭代计算时很常用的计算模式 所以Spark产生了

    RDD是Spark的基石,是实现Spark数据处理的核心抽象。那么RDD为什么会产生呢?

    Hadoop的MapReduce是一种基于数据集的工作模式,面向数据,这种工作模式一般是从存储上加载数据集,然后操作数据集,最后写入物理存储设备。数据更多面临的是一次性处理。

    MR的这种方式对数据领域两种常见的操作不是很高效。第一种是迭代式的算法。比如机器学习中ALS、凸优化梯度下降等。这些都需要基于数据集或者数据集的衍生数据反复查询反复操作。MR这种模式不太合适,即使多MR串行处理,性能和时间也是一个问题。数据的共享依赖于磁盘。另外一种是交互式数据挖掘,MR显然不擅长。

    MR中的迭代:

    [外链图片转存失败(img-EOHWHhlC-1564289120071)(image/1563092347993.png)]

    Spark中的迭代:

    [外链图片转存失败(img-v4oIeV1H-1564289120073)(image/1563092365180.png)]

    我们需要一个效率非常快,且能够支持迭代计算和有效数据共享的模型,Spark应运而生。RDD是基于工作集的工作模式,更多的是面向工作流。

    但是无论是MR还是RDD都应该具有类似位置感知、容错和负载均衡等特性。

  • RDD 的基本概述 ?

  1. RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合


    如何理解数据抽象 ❓

    ❤️ ​其实可以理解成 : 假设我们把狗抽象成Dog类, 狗对应的是各种数据 , Dog类对应的是 RDD , Dog类中有属性 比如 dogName , dogAge … 而RDD类中 是对应的分区数 (partation) RDD依赖 加载到内存中的数据的地址(address) 等等 …

    我们对RDD的一些操作都被封装到对应的算子当中,所以我们只需要调用对应的RDD算子就可以


  2. 在 Spark 中,对数据的所有操作不外乎创建 RDD、转化已有RDD 以及调用 RDD 操作进行求值。每个 RDD 都被分为多个分区,这些分区运行在集群中的不同节点上。

  3. RDD 可以包含 Python、Java、Scala 中任意类型的对象, 甚至可以包含用户自定义的对象。

  4. ❤️RDD具有数据流模型的特点:自动容错、位置感知性调度 和 可伸缩性。

    • 1️⃣ ​自动容错

      RDD实现了基于Lineage(血统)的容错机制。RDD的转换关系,构成了compute chain(计算链),可以把这个compute chain认为是RDD之间演化的Lineage。在部分计算结果丢失时,只需要根据这个Lineage重算即可

      ⭐️举个简单的例子 :

      1. 初始状态 从本地读取数据并转换为 rdd1 然后 通过算子转换成 rdd2
      2. rdd2 再执行算子转换成rdd3 , 这样就形成了一个计算链 rdd1->rdd2->rdd3
      3. rdd2是由rdd1 生成的rdd1可以理解成是rdd2的父亲 同理rdd2是rdd3的父亲
      4. 假设rdd2计算结果丢失 但是其转换的记录是保存的可以根据计算链重新调用对应的算子 从rdd1重新生成rdd2 这样就保证了哪怕计算结果丢失了,也可以重新找回来
    • 2️⃣ 位置感知性

    • 3️⃣ 可伸缩性

  5. RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度

  6. RDD支持两种操作:转化操作和行动操作。

    • RDD 的转化操作是返回一个新的 RDD的操作,比如 map()和 filter(),

    • 行动操作则是向驱动器程序返回结果或把结果写入外部系统的操作。比如 count() 和 first()。

  7. ❤️ RDD 的分区(或者也叫分片):

    • 分区 (partition) :

      当遇到一个 RDD 比较大的情况 ,为了提高运算效率,通常会设置多个分区, 并行计算,每一个分区都对应一个 task 进行并行计算

      [外链图片转存失败(img-5ZIHDfjl-1564289120076)(image/1563971071710.png)]

    • 分区策略

      1. RDD 分片函数描述分片模式 和分片粒度❓ ,Paratitioner 函数决定RDD 本身的分片数据

        同时决定了 parentRDD shuffle 输出时的分片数据

      2. Spark实现两种类型的分片函数:基于哈希的HashPartitioner和基于范围的RangePartitioner。区别在于只有Key-Value类型的RDD才有分区的,非Key-Value类型的RDD分区的值是None的。

      3. 参考 : SparkRDD 分区策略


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兀坐晴窗独饮茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值