我们知道一个task在执行一个RDD时,会调用rdd的iterator()方法,计算当前的partition.
但是,如果之前从来没有对这个RDD进行持久化,那么实际上是从RDD的父RDD来执行我们的算子来计算新的RDD的partition数据。
如果这个RDD以前持久化过,那么就是说它的StoreLevel肯定不是NONE,那么此时CacheManager就会帮忙我们直接去找到持久化的数据
虽然我们持久化过,但如果因为一些原因,数据却拿不到了,BlockManager首先从本地读取数据,如果本地没有,则尝试从远程获getRemote()方法
如果远程也无法获取数据,会尝试读取之前checkpoint过的数据,如果连checkpoint的数据都没有读取到,那么就只能重新计算一份,并把计算完的数据进行持久化
对数据持久化,当持久级别是硬盘时,就直接用BlockManager.doPut()方法持久化
对数据持久级别是内存时,先保存数据到内存,如果内存不够时,会调用自己的算法,把内存中的一部分数据持久化磁盘,整理出来一部分空间,然后在将数据写入内存。
网友评论