Storage模块中,对于存储层进行了抽象,使用接口将抽象和实现进行了完美的分离。对于块的存储,抽象出BlockStore类,在BlockStore类中提供抽象和钩子方法,实现不同存储时,就可以灵活的根据现实情况进行实现。BlockStore有三个不同的实现,分别是Disk-Store、MemoryStore、ExternalBlockStore。在BlockManager中,存储块数据会根据StorageLevel的设置,选择BlockStore的不同实现,而StorageLevel则提供给用户,使用户可以根据机器性能、集群配置、使用场景等灵活的选择block的存储级别。
正是因为BlockStore的抽象,使得BlockManager的实现只需要关注BlockStore接口,而不必关心繁琐的实现细节,这是面向接口编程的典型应用。并且Spark为用户提供了详尽的StorageLevel,用户无需自己定义,只需要根据实际情况灵活选择即可。
实际上StorageLevel是Spark为用户提供的一个存储功能选择开关,而实现的细节完全由Spark Storage模块隐藏。而且Storage模块对外提供了一个交互的接口BlockManager,对于不同的存储如Disk、Memory、External等抽象出了BlockStore,这使得BlockManager可以以面向接口编程的方式来使用不同的Store,而无需关心具体Store的实现细节。通过面向接口编程,保证了模块代码的可复用性、灵活性、可扩展性以及程序的健壮性。(www.xing528.com)
在Storage通信层里面,Slave结点上的Executor中的BlockManager通过BlockManagerS-laveEndPoint和Master结点的BlockManagerMasterEndpoint进行通信。RPC远程过程调用在Spark中担任通信功能,大大简化了Spark架构复杂度。下一小节将详细讲解Storage模块的整体架构。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。