Resilient Distributed Dataset的一些小回顾

本文详细介绍了Spark中的核心概念——弹性分布式数据集(RDD),包括其基本特性、计算模式、属性、算子操作及特点。阐述了RDD的存储弹性、容错弹性、计算弹性及分片弹性,以及如何通过缓存和checkpoint机制提高数据处理效率。

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

					Resilient Distributed Dataset

理解什么是RDD

RDD:弹性分布式数据集,RDD其实就是分布式的元素集合,是一个不可变的分布式对象集合
引用自Spark快速大数据分析-P21

惰性计算模式

Spark采用的是惰性计算模式,RDD只有第一次在行动操作中用到的时候,才会真正的计算.Spark可以优化整个
计算过程.默认情况下,Spark的RDD会在你每次对它们进行行动操作时重新计算.如果想要在多个行动操作中重
用同一个RDD,可以使用 RDD.persist() 让Spark把这个RDD缓存下来;

RDD的属性

  • A list of partitions
  • A function for computing each split
  • A list of dependencies on other RDDs
  • Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
  • Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
  1.  一组分片(Partition),即数据集的基本组成单位。对于RDD来说,每个分片都会被一个计算任务处理,并决定并行计算的粒度。用户可以在创建RDD时指定RDD的分片个数,如果没有指定,那么就会采用默认值。默认值就是程序所分配到的CPU Core的数目;
    
  2.  一个计算每个分区的函数。Spark中RDD的计算是以分片为单位的,每个RDD都会实现compute函数以达到这个目的。compute函数会对迭代器进行复合,不需要保存每次计算的结果;
    
  3.  RDD之间的依赖关系。RDD的每次转换都会生成一个新的RDD,所以RDD之间就会形成类似于流水线一样的前后依赖关系。在部分分区数据丢失时,Spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区进行重新计算;
    
  4.  一个Partitioner,即RDD的分片函数。当前Spark中实现了两种类型的分片函数,一个是基于哈希的HashPartitioner,另外一个是基于范围的RangePartitioner。只有对于于key-value的RDD,才会有Partitioner,非key-value的RDD的Parititioner的值是None。Partitioner函数不但决定了RDD本身的分片数量,也决定了parent RDD Shuffle输出时的分片数量;
    
  5.  一个列表,存储存取每个Partition的优先位置(preferred location)。对于一个HDFS文件来 说,这个列表保存的就是每个Partition所在的块的位置。按照“移动数据不如移动计算”的理念,Spark在进行任务调度的时候,会尽可能地将计算任务分配到其所要处理数据块的存储位置
    

RDD弹性

存储弹性:内存与磁盘的自动切换
容错弹性:数据丢失可以自动回复
计算弹性:计算出错重试机制
分片弹性:根据需要重新分片

RDD算子操作

RDD有输入算子、变换算子、缓存算子、行动算子;
RDD支持两种操作:转换操作和行动操作;
在这里插入图片描述

RDD的特点

只读

RDD是只读的,想要操作RDD,要对现有的RDD创建新的RDD才可以

依赖

RDD通过操作算子进行转换,转换得到新的RDD包含了从其他RDD衍生所必须的信息,RDD之间维护着这种血缘关系,也称为依赖.依赖包含两种一种是窄依赖:RDD之间分区是一一对应的,另一种是宽依赖,下游RDD的每个分区与上游RDD的每个分区都有关,是多对多的关系

缓存

如果在应用程序中多次使用同一个RDD,可以将该RDD缓存起来,该RDD只有在第一次计算的时候会根据血缘关系得到分区的数据,在后续其他地方用到该RDD的时候,会直接从缓存处取而不用再根据血缘关系计算,这样加速后期的重用;

checkpoint

虽然RDD的血缘关系可以自动容错,但是对于长时间迭代型应用程序来说,随着迭代的进行,RDD之间的血缘关系越来越长,一旦后续迭代出错,需要通过非常长的血缘关系去重建,势必影响性能.为此RDD支持checkpoint将数据保存到持久化的存储中,这样就可以切断之前的血缘关系,因为checkpoint后的RDD不需要直到它的父RDD了,它可以从checkpoint处拿到数据;

总结

给定一个RDD我们至少可以知道如下几点信息:1、分区数以及分区方式;2、由父RDDs衍生而来的相关依赖信息;3、计算每个分区的数据,计算步骤为:1)如果被缓存,则从缓存中取的分区的数据;2)如果被checkpoint,则从checkpoint处恢复数据;3)根据血缘关系计算分区的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值