文章目录
RDD 编程模型
需求:需要在多个并行操作之间 重用 工作数据集。
典型场景:机器学习和图应用中常用的迭代算法(每一步对数据执行相似的函数)
数据重用隐藏在系统实现背后,没有将重用逻辑显式地抽象出来形成通用接口。
RDD则是直接在编程接口层面提供了一种高度受限的共享内存模型。
RDD(弹性分布式数据集,Resilient Distributed Dataset),其本质是一种分布式的内存抽象,表示一个只读的数据分区(Partition)集合。
一、RDD 之间的依赖关系(Dependency)
如何生成RDD?
- 通过已有的文件系统构建而成
- 通过其他RDD转换而成(map join 和 filter)
- 窄依赖
RDD之间分区是一一对应的
窄依赖中的所有操作可以通过类似管道(Pipeline)的方式全部执行,宽依赖意味着数据需要在不同节点之间的 Shuffle 传输
- 宽依赖
下游RDD的每个分区与上游RDD(也称之为父RDD)的每个分区都有关,是多对多的关系。
二、RDD计算
(1)RDD 获得数据
RDD计算的时候会通过一个 compute
函数得到每个分区的数据.
-
若 RDD 是通过已有的文件系统构建的,则
compute
函数读取指定文件系统的数据 -
若 RDD 是通过其他 RDD 转换而来的, 则
compute
函数执行转换逻辑,将其他RDD的数据进行转换.
(2)RDD 计算任务
从稳定的物理存储(如分布式文件系统 HDFS)中加载记录, 记录被传入由一组确定性操作构成的 DAG(有向无环图)
, 然后写回稳定存储。
一个任务流可以描述为 DAG
(3)RDD 操作算子
在 Spark 中, RDD 可以创建为对象,通过对象上的各种方法调用来对 RDD 进行转换。
经过一系列的transformation
逻辑之后,就可以调用action
来触发 RDD 的最终计算。
-
transformation
用来将 RDD 进行转换,构建 RDD 的依赖关系 -
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
机制 将数据保存到持久化的存储中。