driver 部分
dispatcher 的作用?
分发 rpc 消息到不同的 endpoint
driver 启动以后会有几个 endpoint ?
8个 endpoint
这8个 endpoint 分别是哪些?
endpoint-verifier
MapOutputTracker
BlockManagerMaster
BlockManagerEndpoint1
OutputCommitCoordinator
HeartbeatReceiver
CoarseGrainedScheduler
AppClient
每个 spark 组件的 spark 协议地址命名规范
spark://CoarseGrainedScheduler@192.168.232.234:37398
第一部分 spark
第二部分 组件名称
第三部分 组件所在地址
第四部分 绑定的端口
endpoint 向 dispatcher 注册的流程
1.先使用 endpoint 的套接字地址 和 endpoint 名称构造一个 RpcEndpointAddress 对象,作为地址的标识符
2.然后使用刚刚构造的地址标识符 和 rpc 环境对象,构造出一个 NettyRpcEndpointRef 对象。
备注:NettyRpcEndpointRef 的作用,如果其中的地址是本机正在监听的端口,仅仅是对地址做了封装。如果在其他主机,收到了 driver 发送的的序列化的对象,其他主机用它来监听 通过 TransportClient 对象发送的消息
3.以 endpoint 的名称为 key,包含有 endpoint 名称, endpoint 对象 , endpointRef 对象的 EndpointData 为 value,添加到 endpoints 的 map 中
备注:EndpointData 的作用,包含有一个 inbox 对象,作为收件箱,存储发送给 这个 endpoint 的 消息
4.然后将 EndpointData 对象作为 key,NettyRpcEndpointRef 对象作为 value 添加到 endpointRefs map 中
5.dispatcher 将 EndpointData 添加到 dispatcher 的消息队列 receivers 中
每个 endpoint 是如何收消息的?
每个 endpoint 都有一个对应的 EndpointData 对象
这个 EndpointData 对象有一个成员变量 inbox
inbox 作为收件箱,存放推送给 endpoint 的消息
inbox 作为收件箱是如何将异步推送给组件不同方法去处理的
inbox 有一个并发的消息队列 messages 用来存放消息
在 dispatcher 的消息队列 获取到 receivers 中的 EndpointData 以后,dispatcher 会启动这个 EndpointData 的 inbox,让 inbox 进入循环,不断的监听 messages 队列
dispatcher 如何将消息推送给指定的 endpoint
dispatcher 收到消息以后,会根据 endpoint 的名称,获取对应的 EndpointData 对象
往这个 endpoint 对象的 inbox 中推送消息
driver 的 rpc server 是哪一个?
在调用 NettyRpcEnv 的 startServer 的时候会启动一个 Rpc Server,是一个 TransportServer 对象。
driver 的 rpc server 是如何处理 rpc 消息的
TransportServer 作为 Netty 的 server 端启动,使用 RpcHandler 对象 对 netty 的 套接字通道 SocketChannel 中的消息进行处理
NettyRpcHandler 作为 RpcHandler 的子类负责具体的 rpc 处理。
将消息发送者的地址 和 RPC env 以及 代表消息的 ByteBuffer 封装成 RequestMessage