以Spark 2.x为标准(通信框架使用Netty)
org.apache.spark.deploy.master 包下的 launchDriver方法
workerInfo中的endpoint就是RpcEndpointRef对象
RpcEndpointRef是一个抽象类
在Spark1.x的时代Spark底层使用Akka进行通信的, 到了2.x就换成了更加好用的Netty框架
下面我们来看一下NettyRpcEndpointRef中send方法的实现
首先调用了require方法传入两个参数 第一个为Boolean值表示传入message是否为null, 第二个是String 类型的抛异常会出现的相关提示
从这里我们可以看出如果传入消息为null则会抛出异常
否则进行下一步,调用nettyEnv的send方法真正的实现消息的传输
我们看到这个message也是一个经过封装的数据格式
首先我们先说明一下message to local RPC endpoint的情况:
dispatcher的postOneWayMessage方法
下面讲一下上面的三个点
1.
endpoints是一个dispatcher中的ConcurrentHashMap 是<String, EndpointData>的结构
String储存消息输送终端的name
EndpointData存储了endpoint的详细信息
包括了 name, 整个RpcEndPoint, 整个NettyRpcEndpointRef,
一个Inbox对象
2.
Data是上面从HashMap中取出的EndpointData, 这里调用他的inbox对象的post方法
3.
这里的receivers是一个Queue[EndpointData],通过offer方法将data存入
到此为止只是把要发送的数据全部post到想要存放的数据结构中,程序是从哪里以什么样的方式使用Netty框架对消息进行输送还不得而知.今天研究了local RPC, inBox, 明天继续对remote RPC, outBox进行研究