深入剖析Yarn的源码(一) 协议签名

写在前面

经过了一阵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中的注解如何运用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值