弹性分布式数据集(Resilient Distributed Dataset,RDD),它是逻辑集中的实体,在集群中的多台机器上进行分区。
RDD是Spark数据存储的核心,可以抽象地理解为一个大数组(Array),但是这个数组是分布在集群上 。
RDD是Spark的核心数据结构,通过RDD的依赖关系形成Spark的调度顺序。通过对RDD的操作形成整个Spark程序。
BlockManager管理RDD的物理分区,每个Block就是节点上对应的一个数据块,存储在内存或磁盘中。
RDD中的Partition是一个逻辑数据块,对应相应的物理块Block。
分区是一个逻辑概念,通过Transformation算子的变换后得到的新旧分区在物理上可能是同一块内存存储
有些RDD是计算的中间结果,其分区并不一定有相应的内存或磁盘数据与之对应
本质上,一个RDD在代码中相当于是数据的一个元数据结构,存储数据分区(block)及其逻辑结构(Partition)的映射关系,存储RDD之前的依赖转换关系。
- RDD的重要内部属性(数据结构):
1. 分区列表
2. 计算各个分片的函数
3. 对父RDD的依赖列表(窄依赖:对父RDD的某个固定partition依赖;宽依赖:对父RDD的所以partition依赖)
4. 对键值对数据类型RDD的分区器,控制分区策略和分区数
5. 每个数据分区的地址列表(如HDFS上的数据块的地址)
- RDD的创建方式:
1. 从Hadoop文件系统(或者与Hadoop兼容的其他持久化存储系统,Hive,HBase,Cassandra)输入创建
2. 从父RDD转换得到新的RDD
- RDD的两种操作算子:
1. Transformation(变换):是延迟计算的,从一个RDD转换生成另一个RDD的转换操作不是马上执行的,需要等到有Actions操作时,才开始出发运算
2. Action(行动):会触发Spark提交作业(Job),并将数据输出到Spark系统