spark 源码分析之九--Spark RPC剖析之StreamManager和RpcHandler

StreamManager

StreamManager类说明

StreamManager 官方说明如下:

The StreamManager is used to fetch individual chunks from a stream. This is used in TransportRequestHandler in order to respond to fetchChunk() requests. Creation of the stream is outside the scope of the transport layer, but a given stream is guaranteed to be read by only one client connection, meaning that getChunk() for a particular stream will be called serially and that once the connection associated with the stream is closed, that stream will never be used again.
 
即StreamManager用于从流中获取单个块。这在TransportRequestHandler中用于响应fetchChunk()请求。流的创建超出了传输层的范围,但是保证给定流只能由一个客户端连接读取,这意味着特定流的getChunk()将被串行调用,并且一旦与流关联的连接关闭后,该流将永远不会再次使用。

StreamManager两个子类实现

它有两个子类:

可以看到它有两个实现,一个实现是OneForOneStreamManager,也就是说的getChunk 方法被串行调用,一旦关闭不再使用。其关键方法 getChunk 如下:

其中,sream 维护了 streamId 和 StreamState 的映射关系。

StreamState 的类结构如下:

appId 是TransportClient 的 id 号;

associatedChannel 表示 与之关联的 channel 对象;

buffer 是 一个 迭代的 ManagedBuffer 对象,其中ManagedBuffer是一个不可变的byte数组的抽象;

chunksBeingTransferred保存了正在传输的chunk number;

curChunk 保存了已经完成的chunk 的 下标索引。

 

另一个实现是NettyStreamManager是用于支持管理器注册资源的,主要被SparkContext 使用,它不支持getChunk 这个关键的方法。

个人观点,这个类不应该继承StreamManager 了,因为它的关键功能 getChunk 都不能用了。

RpcHandler

NettyRpcHandler继承了RpcHandler,并实现了 logging trait。

超类RpcHandler

其官方解释如下:

Handler for sendRPC() messages sent by TransportClients.

即它是处理 TransportClient 发送的 rpc 消息的handler。也就是说,这是在server 端使用的

其类结构如下:

其关键方法解释如下:
1. receiveStream 方法:接收单个RPC消息,其中包括要作为流接收的数据。在此方法中抛出的任何异常将以字符串形式作为标准RPC故障发送回客户端。对于单个TransportClient(即通道),不会并行调用此方法和receive方法。从流中读取数据时出错(org.apache.spark.network.client.StreamCallback.onData(String,ByteBuffer))将导致整个通道失败。在org.apache.spark.network.client.StreamCallback.onComplete(String)中对流进行“后处理”失败将导致rpcFailure,但该通道将保持活动状态。
2. receive 方法:接收单个RPC消息,其中包括要作为流接收的数据。在此方法中抛出的任何异常将以字符串形式作为标准RPC故障发送回客户端。对于单个TransportClient(即通道),不会并行调用此方法和#receive。从流中读取数据时出错(org.apache.spark.network.client.StreamCallback.onData(String,ByteBuffer))将导致整个通道失败。在org.apache.spark.network.client.StreamCallback.onComplete(String)中对流进行“后处理”失败将导致rpcFailure,但该通道将保持活动状态。
有两个重载的 receive 方法,其关系如下:

ONE_WAY_CALLBACK 方法是一个默认的OneWayCallback 实现,主要是用于打印日志track。 

NettyRpcHandler

子类NettyRpcHandler 的官方说明如下:

Dispatches incoming RPCs to registered endpoints. The handler keeps track of all client instances that communicate with it, so that the RpcEnv knows which TransportClient instance to use when sending RPCs to a client endpoint (i.e., one that is not listening for incoming connections, but rather needs to be contacted via the client socket). Events are sent on a per-connection basis, so if a client opens multiple connections to the RpcEnv, multiple connection / disconnection events will be created for that client (albeit with different RpcAddress information).

即,它是负责将传入的RPC调度到已注册的端点上的handler。它跟踪与之通信的所有客户端实例,以便RpcEnv知道在将RPC发送到客户端端点时使用哪个TransportClient实例(即,一个不监听传入连接,但需要通过客户端套接字)。事件是基于每个连接发送的,因此如果客户端打开与RpcEnv的多个连接,将为该客户端创建多个连接/断开连接事件(尽管具有不同的RpcAddress信息)。

其关键方法如下:

首先它会根据传进来的TransportClient的channel获取到 remoteAddress 的信息,然后和ByteBuffer 类型的message 进一步封装成RequestMessage然后将接收进来的事件post给Dispatcher对象,Dispatcher再做进一步分发。

 

posted @ 2019-07-08 23:45  JohnnyBai  阅读(843)  评论(0编辑  收藏  举报