【Spark】之 RDD(Resilient Distributed Dataset)

本文深入探讨了Spark中RDD(弹性分布式数据集)的概念,包括其生成方式、依赖关系及计算流程。阐述了窄依赖与宽依赖的区别,以及RDD容错机制中的Lineage和checkpoint机制,为理解Spark数据处理提供了关键视角。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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机制 将数据保存到持久化的存储中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值