spark通信环境
早期spark利用 Akka 作为内部通信部件,后来使用Netty替代Akka
BIO(阻塞式IO):当多个线程等待同一种资源时,在BIO模式下,未等到资源的线程会被阻塞
NIO(非阻塞式IO):当多个线程等待同一种资源时,在NIO模式下,未等到资源的线程可以先去做其他操作,但是在这个过程中会轮询等待的资源
AIO(异步非阻塞式IO):当多个线程等待同一种资源时,在AIO模式下,未等到资源的线程可以完全去做其他操作,等资源轮到该线程,就把资源送到指定位置即可
由于linux对AIO支持不好,因此linux利用Epoll的方式模仿AIO操作
Driver和Executor通信机制
在Driver和Executor中其实组件是相似的
inbox:收件箱,用来收来自各个Executor的信件
ouboxes:发件箱,用来向Driver等发信件
TransportClient:Netty 通信客户端,一个 OutBox 对应一个TransportClient,TransportClient不断轮询 OutBox,根据 OutBox 消息的receiver 信息,请求对应的远程 TransportServer
TransportServer:Netty 通信服务端,一个 RpcEndpoint 对应一个 TransportServer,接受远程消息后调用 Dispatcher 分发消息至对应收发件箱
每个TransportClient实例只能和一个远端的RPC服务通信,所以Spark中的组件如果想要和多个RPC服务通信,就需要持有多个TransportClient实例