Spark的BlockManager数据存储与管理机制
一、概述
BlockManager是整个Spark底层负责数据存储与管理的一个组件,Driver和Executor的所有数据都由相应节点上的BlockManager进行管理。
(1)driver端上的存储与管理
Driver上有BlockManagerMaster,负责对各个节点上的BlockManager内部管理的数据的元数据进行维护,比如block的增删改等操作,都会在这里维护好元数据的变更。 每个节点都有一个BlockManager,每个BlockManager创建之后,立马向BlockManagerMaster进行注册,此时BlockManagerMaster会为其创建对应的BlockManagerInfo。如下图所示。
BlockManagerMaster与BlockManager的关系非常像NameNode与DataNode的关系,BlockManagerMaster中保存中BlockManager内部管理数据的元数据,进行维护,当BlockManager进行Block增删改等操作时,都会在BlockManagerMaster中进行元数据的变更,这与NameNode维护DataNode的元数据信息,DataNode中数据发生变化时NameNode中的元数据信息也会相应变化是一致的。
(2)各个节点上的blockManager
1、三个重要组件
1)DiskStore:负责对磁盘数据进行读写;
2)MemoryStore:负责对内存数据进行读写;
3)BlockTransferService:负责建立BlockManager到远程其他节点的BlockManager的连接,负责对远程其他节点的BlockManager的数据进行读写;
2、blockManager的写操作
使用BlockManager进行写操作时,如RDD运行过程中的一些中间数据我们手动指定了persist(),会优先将数据写入内存中,如果内存大小不够,会使用自己的算法,将内存中的部分数据写入磁盘;若persist()指定了要replica,那么会使用BlockTransferService将数据replicate一份到其他节点的BlockManager上去。
3、blockManager的读操作
使用BlockManager进行读操作时,如shuffleRead操作,如果能从本地读取,就利用DiskStore或者MemoryStore从本地读取数据,但是本地没有数据的话,那么会用BlockTransferService与有数据的BlockManager建立连接,然后用BlockTransferService从远程BlockManager读取数据;例如,shuffle Read操作中,很有可能要拉取的数据在本地没有,那么此时就会到远程有数据的节点上,找那个节点的BlockManager来拉取需要的数据。
总结:只要使用BlockManager执行了数据增删改的操作,那么必须将Block的BlockStatus上报到BlockManagerMaster,在BlockManagerMaster上会对指定BlockManager的BlockManagerInfo内部的BlockStatus进行增删改操作,从而达到元数据的维护功能。