首页 理论教育 Partition和Block的对应关系

Partition和Block的对应关系

时间:2023-06-29 理论教育 版权反馈
【摘要】:目前为止,也许读者还有一个疑问,RDD中的partition是如何与Storage中的blockId对应的呢?cacheM-anager就是一个RDD缓存的管理类,在其getOrCompute函数中,将看到Partition和blockId之间的对应关系。RDD中的Transaction操作和Action操作,虽然逻辑上是在Partition上进行的操作,但最终还是转换成了Block,实际上对数据的存储都发生在Block上。并且讲解了RDD中针对partition的计算最终都转化成对Block的计算,通过代码跟踪的方式解释了RDD中Partition和Block之间的关系。实际上Partition和Block是等价的,只是看待的角度不同。

Partition和Block的对应关系

至此,已了解了Spark Storage模块存储层的架构及代码实现。目前为止,也许读者还有一个疑问,RDD中的partition是如何与Storage中的blockId对应的呢?接下来将揭开这个谜。

在RDD中,计算的重要方法是iterator,该方法的源代码如下。

iterator方法中,首先判断StorageLevel是否设置,如果没有设置,说明在DiskStore、MemoryStore和ExternalBlockStore中没有存储该RDD。反之,如果设置了StorageLevel,即StorageLevel不等于StorageLevel.NONE,则说明在BlockStore中存有该RDD。RDD作为Spark中最重要的抽象数据集,其数据可以通过计算得到,为了避免重复计算,可以将多次使用的RDD缓存起来,再次使用时直接从缓存中获取,而不再重新计算,提高整体性能。cacheM-anager就是一个RDD缓存的管理类,在其getOrCompute函数中,将看到Partition和blockId之间的对应关系。getOrCompute函数的源代码如下所示。

代码中使用rdd.id和partition.index构建出一个RDDBlockId对象,在构建RDDBlockId对象的过程中,重写name方法,该方法的代码如下所示。

如上面代码所示,此时的blockId用传入的rddId和splitIndex拼凑而成,格式如”rdd”_+rddId+”_”+splitIndex格式。调用blockManager的get方法取出blockId对应的数据。如果blockManager的get方法返回None,说明BlockManager中没有这个block,需要通过计算获取,并将计算得到的block数据存入BlockManager中。block的计算和存储是阻塞的,其他的线程需要等到该block装载结束后才能操作该block。(www.xing528.com)

RDD中的Transaction操作和Action操作,虽然逻辑上是在Partition上进行的操作,但最终还是转换成了Block,实际上对数据的存储都发生在Block上。

本节对Storage模块的通信层和存储层进行了较为全面的讲解,包括Storage模块通信层的通信模式,以及存储层中不同的存储实现。并且讲解了RDD中针对partition的计算最终都转化成对Block的计算,通过代码跟踪的方式解释了RDD中Partition和Block之间的关系。实际上Partition和Block是等价的,只是看待的角度不同。

在下一节中,将对比不同Storage Level的性能,并对如何正确选择StorageLevel等级进行探讨。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈