后面曾经差不多把执行的流程都讲完了,这篇讲讲每个Task执行的后果是如何存储和读取的。

BlockManager

BlockManager是SparkEnv中的组件之一,存储体系的所有组件和性能都是依赖着BlockManager,包含之前提到的ShuffleManager、DiskBlockManager、MapOutputTracker等,这篇会的流程也会再解说一次。

BlockManagerMaster

BlockManager是SparkEnv的一部分,那Driver和Executor启动的时候,都会对BlockManager进行实例化。而Driver和Executor之间的BlockManager通信,包含注册BlockManager、更新Block信息、获取Block的地位(即Block所在的BlockManager)、删除Executor等,都是通过BlockManagerMaster。
Driver启动的时候,BlockManagerMaster会创立BlockManagerMasterEndpoint并注册到Driver的RpcEnv中,而Executor启动的时候,会创立BlockManagerMasterEndpointRef,指向Driver的BlockManagerMasterEndpoint。

BlockManagerMasterEndpoint中保护着一个HashMap,key为BlockManagerId,value为BlockManagerInfo。BlockManagerId是惟一的,就是通过BlockManagerMasterEndpoint来治理的。
当Driver和Executor初始化BlockManager的时候,都会向BlockManagerMasterEndpoint发动RegisterBlockManager申请。Driver是发送给本人的,Executor通过BlockManagerMasterEndpointRef发送给BlockManagerMasterEndpoint。

BlockManagerMasterEndpoint收到申请后,就会更新map里的值,所以BlockManagerMasterEndpoint治理着所有的BlockManagerId。并且把BlockManagerId返回给申请方。那BlockManagerId是什么?

BlockManagerId

不同节点和实例上的BlockManager进行互相通信的时候,就须要有一个惟一的身份标识-BlockManagerId。
BlockManagerId包含host、port、executorId等信息。如果实例是Driver,那么executorId为driver,否则由Master负责给各个Executor调配,ID格局为app-日期格局字符串-数字。
上图中,第一个是的Driver的BlockManager,她的executorId为driver。第二个是Executor的BlockManager,她的executorId略过日期格局,简写为app-0。第三个Executor的BlockManager,她的executorId略过日期格局,简写为app-1。

DiskBlockManager

BlockManager中有一个用来对磁盘上的文件及目录的读写操作进行治理,叫做磁盘块管理器DiskBlockManager。
当要写入磁盘的时候(这里能够看之前Task的执行过程),DiskBlockManager就会创立惟一的BlockId和文件,用来存储Shuffle两头后果。

DiskBlockManager保护着本地目录的数组localDirs以及本地子目录的二维数组subDirs。localDirs为blockmgr-为前缀,前面加UUID。subDirs记录本地子目录的数量,默认是64,所以创立文件的时候,就会依据判断二级目录是否存在,如果不存在则创立二级目录。
整个树形构造如下:

比方创立TempShuffleBlock,文件门路如下:

DiskBlockObjectWriter

DiskBlockManager创立文件后,对文件的写入操作是由DiskBlockObjectWriter来实现的(这里能够看之前Task的执行过程),最初合并后,就有了data数据文件和index索引文件。而后告知Driver文件的信息,此步骤具体见Task执行后果的解决。

BlockTransferService

Executor执行的过程中,会创立很多个块,块的传输都是通过块传输服务BlockTransferService,次要用于不同阶段的工作之间的Block数据的传输与读写。默认为NettyBlockTransferService,每个BlockTransferService都有netty对应的server用于提供服务和clientFactory用于创立client。
假如Executor1执行的时候,通过trackerEndpoint向Driver的MapOutputTrackerMasterEndpoint获取到了她须要的block信息(此步骤具体见Task执行后果的解决)在Executor0,与是通过NettyBlockTransferService向Executor0获取block信息。

Executor0接管到信息后,就会通过DiskBlockManager把data文件和index文件取出来,依据起始偏移量返回数据给Executor1。