写在前面
经过了一阵Yarn的简单的源码阅读,发现自己对于之前学习的一些知识就是边捡边丢,而且不是很透彻,现在将自己阅读到的细节实现做简要的剖析。
这个系列是我第一次写系列博文,本系列适用于有hadoop基础的想了解内部实现源码的程序员,也许还有很多讲解不详细的或者不明确的地方,如有问题,欢迎拍砖。(PS:此系列分析源码为2.6稳定版,如何将源码编译到eclipse下我就不赘述了,请大家百度一下~)
背景描述
hadoop 2.x 最大的版本更新就是在Yarn的引入,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
我们分析Yarn的源码也是从Common包中的类一点点深入,此文我们分析Yarn的Rpc通信间的协议部分。
协议签名
协议签名是hadoop各个机器 rpc通信,用于验证协议是否正确的类(ProtocolSignature),位于org.apache.hadoop.ipc包下,其内部缓存了一个HashMap存储协议名称和该协议对应的指纹和协议签名。其中,指纹是利用method的hashCode以及返回类型名称的hashCode求和并与方法输入的每个参数类型的名称进行异或运算,其源吗如下:
static int getFingerprint(Method method) {
int hashcode = method.getName().hashCode();
hashcode = hashcode + 31 * method.getReturnType().getName().hashCode();
for (Class<?> type : method.getParameterTypes()) {
hashcode = 31 * hashcode ^ type.getName().hashCode();
}
return hashcode;
}
每当得到一个协议的签名时,会先从Map中取,若取到则返回,若取不到则新建一个ProtocolSigFingerprint对象对应存储到Map中并返回,其源码如下:
private static ProtocolSigFingerprint getSigFingerprint(Class<?> protocol, long serverVersion) {
String protocolName = RPC.getProtocolName(protocol);
synchronized (PROTOCOL_FINGERPRINT_CACHE) {
ProtocolSigFingerprint sig = PROTOCOL_FINGERPRINT_CACHE.get(protocolName);
if (sig == null) {
int[] serverMethodHashcodes = getFingerprints(protocol.getMethods());
sig = new ProtocolSigFingerprint(
new ProtocolSignature(serverVersion, serverMethodHashcodes),
getFingerprint(serverMethodHashcodes));
PROTOCOL_FINGERPRINT_CACHE.put(protocolName, sig);
}
return sig;
}
}
ProtocolSignature类中重载了各种返回ProtocolSignature类的方法getProtocolSignature(),返回各种参数所对应的协议签名类。
此类是RPC通信基础中的基础,其中用到了注解类ProtocolInfo,再次不详述,想了解的同学查询一下java中的注解如何运用。