我们经常会对RDD执行一系列Transformation算子操作,逻辑上每经历一次变换,就会将RDD转换为一个新的RDD,RDD会被划分成很多的分区分布到集群的多个节点中。
分区是逻辑概念,为了防止函数式数据不可变行(immutable)导致的内存需求无限扩张,使得系统内存被快速用完,Spark使用延迟执行(lazy)的方式执行,即只有操作累计到Action(行动),算子才会触发整个操作序列的执行,中间结果不会单独再重新分配内存,而是在同一个数据块上进行流水线操作。
也就是说变换前后的新旧RDD的分区在物理上可能是同一块内存存储,这是Spark内部做的优化。有些RDD是计算的中间结果,其分区并不一定有相对应的内存或磁盘数据与之对应,所以如果想要复用某一个RDD,需要通过Cache算子,将数据缓存(或者说固化)到内存中。