Spark的数据存储

来源:互联网 发布:ubuntu jdk 编辑:程序博客网 时间:2024/06/06 01:17

Spark数据存储的核心是弹性分布式数据集(RDD)。RDD可以被抽象地理解为一个大的数组(Array),但是这个数组是分布在集群上的。逻辑上RDD的每个分区叫一个Partition

在Spark的执行过程中,RDD经历了一个个的Transformation算子后,最后通过Action算子进行触发操作。

逻辑上每经历一次变换,就会将RDD转换成为一个新的RDD,RDD之间通过Lineage产生依赖关系,这个关系在容错中有很重要的作用。变换的输入和输出都是通过RDD。

RDD会被划分很多的分区分布到集群的多个节点中,分区是个逻辑概念,变换前后的新旧分区在物理上可能是同一块内存存储。这是很重要的优化,以防止函数式数据不变性(immutable)导致的内存需求无限扩张。有些RDD是计算的中间结果,其分区并不一定有相应的内存或磁盘数据与之对应,如果要迭代使用数据,可以调cache()函数缓存数据。

在物理上,RDD对象实质上是一个元数据结构,存储着Block,Node等的映射关系,以及其他的元数据信息。

一个RDD就是一组分区,在物理数据存储上,RDD的每个分区对应的就是一个Block,Block可以存储到内存,当内存不够时,可以存储到磁盘中。

每个Block中存储着RDD所有数据项的一个子集,暴露给用户的可以是一个Block的迭代器(例如:用户可以通过mapPartitions获得分区迭代器进行操作),也可以就是一个数据项(例如:通过map函数对每个数据项并行计算)。

1 0