文章目录
概述
本文主要描述package org.apache.spark.rpc.RpcEndpoint.scala
中包含的三个Trait
:
RpcEndpoint
功能同Actor,用于rpc通信的实体,通信并处理消息。RpcEnvFactory
用于创建RpcEnv的工厂类ThreadSafeRpcEndpoint
是线程完全的RpcEndpoint
1. RpcEndpoint
1.1 定义
RpcEndpoint是RPC通信的端点,用于定义给定消息要触发的函数。
1.2 生命周期
RpcEndpoint的生命周期为:constructor -> onStart -> receive* -> onStop
注意:
- "receive"可以同时调用。如果您希望"receive"是线程安全的,请使用[[ThreadSafeRpcEndpoint]]
- 如果从 [RpcEndpoint] 方法之一引发任何错误("onError"除外),则"onError"将随原因一起调用。
- 如果"onError"引发错误,[RpcEnv] 将忽略它。
1.3 Filed详解
1.3.1 变量RpcEnv
RpcEndpoint要向此RpcEnv注册
val rpcEnv: RpcEnv
1.3.2 onStart()
在 [RpcEndpoint]开始之前调用onStart处理任何消息。
def onStart(): Unit = {
// By default, do nothing.
}
1.3.3 self()
[ RpcEndpointRef]当调用"OnStart"时,"self"将变为有效。当调用"onStop"时,“self"将变为"null”。
- 注意:因为在"onStart"之前,[RpcEndpoint] 尚未注册,并且没有有效的 [RpcEndpointRef]。
- 因此,在调用"onStart"之前不要调用"self"。
final def self: RpcEndpointRef = {
require(rpcEnv != null, "rpcEnv has not been initialized")
rpcEnv.endpointRef(this)
}
1.3.4 receive()
- 处理来自"RpcEndpointRef.send"或"RpcCallContext.reply"的消息。
- 如果收到不匹配的消息,将抛出"SparkException"并将其发送到"onError"。
def receive: PartialFunction[Any, Unit] = {
case _ => throw new SparkException(self + " does not implement 'receive'")
}
1.3.5 receiveAndReply()
- 处理来自"RpcEndpointRef.ask"的消息。
- 如果收到不匹配的消息,将抛出"SparkException"并将其发送到"onError"
def receiveAndReply(context: RpcCallContext): PartialFunction[Any, Unit] = {
case _ => context.sendFailure(new SparkException(self + " won't reply anything"))
}
1.3.6 onError()
- 在处理消息期间引发任何异常时调用。
def onError(cause: Throwable): Unit = {
// By default, throw e and let RpcEnv handle it
throw cause
}
1.3.7 网络连接处理
onConnected() : 当"远程地址"连接到当前节点时调用。
onDisconnected() :当“远程地址”失去连接时调用.
onNetworkError() : 当前节点和"远程地址"之间的连接中发生某些网络错误时调用
def onConnected(remoteAddress: RpcAddress): Unit = {
// By default, do nothing.
}
def onDisconnected(remoteAddress: RpcAddress): Unit = {
// By default, do nothing.
}
def onNetworkError(cause: Throwable, remoteAddress: RpcAddress): Unit = {
// By default, do nothing.
}
1.3.8 onStop()
- 在 [RpcEndpoint] 停止时调用。
- 在此方法中,“self"将为"空”,您不能使用它发送或询问消息。
def onStop(): Unit = {
// By default, do nothing.
}
1.3.9 stop()
- 停止 [RpcEndpoint] 的便捷方法。
final def stop(): Unit = {
val _self = self
if (_self != null) {
rpcEnv.stop(_self)
}
}
2. RpcEnvFactory
创建RpcEnv的工厂类,包含一个空的构造函数,以便通过反射创建RpcEnv
private[spark] trait RpcEnvFactory {
def create(config: RpcEnvConfig): RpcEnv
}
3. ThreadSafeRpcEndpoint
- 要求RpcEnv线程安全地向其发送消息的特性。
- 线程安全是指在处理下一条消息之前,由同一个[[threadsaferpcendpoint]]处理一条消息。
- 换句话说,在处理下一条消息时,可以看到对[[threasaferpcendpoint]内部字段的更改,
- 并且[[threasaferpcendpoint]中的字段不必是可变的或等效的。
- 但是,不能保证同一线程将对不同的消息执行相同的[[threasaferpcendpoint]]。
private[spark] trait ThreadSafeRpcEndpoint extends RpcEndpoint