计算rdd的某个分区是从RDD的iterator()方法开始的,我们从这个方法进入

CacheManager源码分析 Hadoop 第1张

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

然后我们进入getOrCompute()方法中看看是如何进行读取数据或计算的

CacheManager源码分析 Hadoop 第2张

getOrElseUpdate()方方法的返回值类型如果是blockResult说明blockManager在本地或远程读取到了数据,或者没有读取到数据调用传入的方法computeOrReadCheckpoint重新计算(或读取checkpoint)得到了数据并成功写入缓存(磁盘或内存);如果返回值类型是iterator,说明没有读取到数据,计算得到的数据内存放不下只能返回iterator;

我们进入getOrElseUpdate()方法中

CacheManager源码分析 Hadoop 第3张

 

CacheManager源码分析 Hadoop 第4张

现在我们进入doPutIterator()方法中,看看是如何将计算的数据放入缓存的

CacheManager源码分析 Hadoop 第5张

取得取得了info之后,继续向下走

CacheManager源码分析 Hadoop 第6张

CacheManager源码分析 Hadoop 第7张

进行到这里位置数据已经得到了(iterator),然后会new MapStatus并发送给Master来更新状态,最后会判断存储级别是否要去副本,如果设置了_2之类的级别,就会通过

blockTransferService进行异步发

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄