RDD概念
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。RDD具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度。
RDD(弹性分布式数据集),Spark计算的基石,为用户屏蔽了底层对数据的复杂抽象和处理,为用户提供了一组方便的数据转换与求值方法。
-
RDD全称叫做
弹性分布式数据集(Resilient Distributed Datasets)
,它是一种分布式的内存抽象,表示一个只读的记录分区的集合,它只能通过其他RDD转换而创建,为此,RDD支持丰富的转换操作
(如map, join, filter, groupBy等),通过这种转换操作,新的RDD则包含了如何从其他RDDs
衍生所必需的信息,所以说RDDs之间是有依赖关系
的。基于RDDs之间的依赖,RDDs会形成一个有向无环图DAG
,该DAG描述了整个流式计算的流程,实际执行的时候,RDD是通过血缘关系(Lineage)一气呵成的,即使出现数据分区丢失,也可以通过血缘关系重建分区。 -
总结起来,基于
RDD的流式计算任务可描述为
:从稳定的物理存储(如分布式文件系统)中加载记录,记录被传入由一组确定性操作构成的DAG,然后写回稳定存储。另外RDD还可以将数据集缓存到内存中,使得在多个操作之间可以重用数据集,基于这个特点可以很方便地构建迭代型应用(图计算、机器学习等)或者交互式数据分析应用。可以说Spark最初也就是实现RDD的一个分布式系统,后面通过不断发展壮大成为现在较为完善的大数据生态系统,简单来讲,Spark-RDD的关系类似于Hadoop-MapReduce关系。 -
在 Spark 中,对数据的所有操作不外乎创建 RDD、转化已有RDD 以及调用 RDD 操作进行求值。每个 RDD 都被分为多个分区,这些分区运行在集群中的不同节点上。RDD 可以包含 Python、Java、Scala 中任意类型的对象, 甚至可以包含用户自定义的对象。RDD具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度。
RDD属性
- 一组分片(Partition),即数据集的基本组成单位。对于RDD来说,每个分片都会被一个计算任务处理,并决定并行计算的粒度。用户可以在创建RDD时指定RDD的分片个数,如果没有指定,那么就会采用默认值。默认值就是程序所分配到的CPU Core的数目。
- 一个计算每个分区的函数。Spark中
RDD的计算是以分片为单位的
,每个RDD都会实现compute函数
以达到这个目的。compute函数会对迭代器进行复合,不需要保存每次计算的结果。 - RDD之间的依赖关系。RDD的每次转换都会生成一个新的RDD,所以RDD之间就会形成类似于流水线一样的前后
依赖关系
。在部分分区数据丢失时,Spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区进行重新计算。 - 一个Partitioner,即RDD的分片函数。当前Spark中实现了两种类型的分片函数,一个是基于哈希的
HashPartitioner
,另外一个是基于范围的RangePartitioner
。只有对于key-value的RDD,才会有Partitioner,非key-value的RDD的Parititioner的值是None。Partitioner函数不但决定了RDD本身的分片数量,也决定了parentRDD Shuffle输出时的分片数量。 - 一个列表,存储存取每个Partition的优先位置(preferred location)。对于一个HDFS文件来说,这个列表保存的就是每个Partition所在的块的位置。按照“移动数据不如移动计算”的理念,Spark在进行任务调度的时候,会尽可能地将计算任务分配到其所要处理数据块的存储位置。
总结(RDD的五大特征)
- RDD可以看做是一些列partition所组成的
- RDD之间的依赖关系
- 算子是作用在partition之上的
- 分区器是作用在kv形式的RDD上
- partition提供的最佳计算位置,利于数据处理的本地化即计算向数据移动而不是移动数据
RDD弹性
自动进行内存和磁盘数据存储的切换
- Spark优先把数据放到内存中,如果内存放不下,就会放到磁盘里面,程序进行自动的存储切换
基于血统的高效容错机制
在RDD进行转换和动作的时候,会形成RDD的Lineage依赖链,当某一个RDD失效的时候,可以通过重新计算上游的RDD来重新生成丢失的RDD数据。
Task如果失败会自动进行特定次数的重试
- RDD的计算任务如果运行失败,会自动进行任务的重新计算,默认次数是4次。
Stage如果失败会自动进行特定次数的重试
- 如果Job的某个Stage阶段计算失败,框架也会自动进行任务的重新计算,默认次数也是4次。
Checkpoint和Persist可主动或被动触发
- RDD可以通过Persist持久化将RDD缓存到内存或者磁盘,当再次用到该RDD时直接读取就行。也可以将RDD进行检查点,检查点会将数据存储在HDFS中,该RDD的所有父RDD依赖都会被移除。
数据调度弹性
- Spark把这个JOB执行模型抽象为通用的有向无环图DAG,可以将多Stage的任务串联或并行执行,调度引擎自动处理Stage的失败以及Task的失败。
数据分片的高度弹性
- 可以根据业务的特征,动态调整数据分片的个数,提升整体的应用执行效率。
总结
- 存储的弹性:内存与磁盘的
- 自动切换容错的弹性:数据丢失可以
- 自动恢复计算的弹性:计算出错重试机制
- 分片的弹性:根据需要重新分片
RDD编程API
- RDD支持两种操作:
转化操作
和行动操作
。RDD 的转化操作是返回一个新的 RDD的操作,比如 map()和 filter(),而行动操作则是向驱动器程序返回结果或把结果写入外部系统的操作。比如 count() 和 first()。 - Spark采用
惰性计算模式
,RDD只有第一次在一个行动操作中用到时,才会真正计算。Spark可以优化整个计算过程。默认情况下,Spark 的 RDD 会在你每次对它们进行行动操作时重新计算。如果想在多个行动操作中重用同一个RDD,可以使用 RDD.persist() 让 Spark 把这个 RDD 缓存下来。 - 【Spark】Action与Transformation常用算子总结
RDD执行流程
你知道的越多,你不知道的越多。
有道无术,术尚可求,有术无道,止于术。
如有其它问题,欢迎大家留言,我们一起讨论,一起学习,一起进步
转载:https://blog.csdn.net/qq_40722827/article/details/106588396