【Spark】之 RDD(Resilient Distributed Dataset)

文章目录

    • RDD 编程模型
      • 一、RDD 之间的依赖关系(Dependency)
            • 如何生成RDD?
      • 二、RDD计算
        • (1)RDD 获得数据
        • (2)RDD 计算任务
        • (3)RDD 操作算子
      • 三、RDD 容错
        • (1)`Lineage`
        • (2)`checkpoint` 机制

RDD 编程模型


需求:需要在多个并行操作之间 重用 工作数据集。

典型场景:机器学习和图应用中常用的迭代算法(每一步对数据执行相似的函数)

数据重用隐藏在系统实现背后,没有将重用逻辑显式地抽象出来形成通用接口。

RDD则是直接在编程接口层面提供了一种高度受限的共享内存模型。

RDD(弹性分布式数据集,Resilient Distributed Dataset),其本质是一种分布式的内存抽象,表示一个只读的数据分区(Partition)集合。



一、RDD 之间的依赖关系(Dependency)


如何生成RDD?
  1. 通过已有的文件系统构建而成
  2. 通过其他RDD转换而成(map join 和 filter)
  1. 窄依赖
    RDD之间分区是一一对应的

窄依赖中的所有操作可以通过类似管道(Pipeline)的方式全部执行,宽依赖意味着数据需要在不同节点之间的 Shuffle 传输

  1. 宽依赖
    下游RDD的每个分区与上游RDD(也称之为父RDD)的每个分区都有关,是多对多的关系。


二、RDD计算


(1)RDD 获得数据

RDD计算的时候会通过一个 compute 函数得到每个分区的数据.

  1. 若 RDD 是通过已有的文件系统构建的,则 compute 函数读取指定文件系统的数据

  2. 若 RDD 是通过其他 RDD 转换而来的, 则 compute 函数执行转换逻辑,将其他RDD的数据进行转换.

(2)RDD 计算任务

从稳定的物理存储(如分布式文件系统 HDFS)中加载记录, 记录被传入由一组确定性操作构成的 DAG(有向无环图), 然后写回稳定存储。

一个任务流可以描述为 DAG

(3)RDD 操作算子

在 Spark 中, RDD 可以创建为对象,通过对象上的各种方法调用来对 RDD 进行转换。
经过一系列的 transformation 逻辑之后,就可以调用 action 来触发 RDD 的最终计算。

  1. transformation 用来将 RDD 进行转换,构建 RDD 的依赖关系

  2. action 用来触发 RDD 的计算,得到 RDD 的相关计算结果或将 RDD 保存到文件系统中。

在 Spark 中,只有遇到 action, 才会真正地执行 RDD 的计算
Lazy Evqluation,惰性计算,这样在运行时可以通过管道的方式传输多个转换。



三、RDD 容错


(1)Lineage

Lineage信息 存储 RDD 之间的关系

当 RDD 的某个分区数据计算失败或丢失时,可以通过 Lineage 信息重建

如果在应用程序中多次使用同一个 RDD ,则可以将这个 RDD 缓存起来。

(2)checkpoint 机制

对于长时间迭代型应用来说,随着迭代的进行,RDD 与 RDD之间的 Lineage 信息会越来越长
一旦在后续迭代过程中出错,根据 非常长的Lineage,对性能有很大影响

checkpoint机制 将数据保存到持久化的存储中。

你可能感兴趣的:(【Spark】,Spark,RDD)