一.RPC
- 在http://zy19982004.iteye.com/blog/1875969里曾经提到VersionedProtocol v = RPC.getProxy(...);得到一个Java代理类。实际上RPC就是建立在VersionedProtocol的基础上的。
二.VersionedProtocol类图
三.工作原理
以Client与NameNode通信为例(本文中,不加特别说明,A与B通信,都指A为请求方,B为接收方),Client想在文件系统里创建一个文件夹,会把这一请求通过RPC发送给NameNode,NameNode收到请求后就为Client创建一个文件夹。从这一功能我们可以抽出VersionedProtocol的工作原理。
- 把Client可能向NameNode发送的任何请求封装在一个叫ClientProtocol的接口里面,当然create(String src...)就是其中方法之一。
- RPC Server端NameNode你必须具有能够创建文件夹的功能,也就是你要实现ClientProtocol接口,实现所有的方法。
- 最后Client端要做的就是:ClientProtocol rpcNameNode = (ClientProtocol)RPC.getProxy(ClientProtocol.class, ClientProtocol.versionID...);rpcNameNode .create(String src...)获得代理类并调用create(src)方法。这样,Client的请求就在NameNode上被执行了,如果方法有返回值,NameNode返回返回值即可。
总结一句话就是:A与B通信,B必须实现A protocol的所有方法。
四.两两通信
- 在HDFS里面存在四个角色:Client, DataNode, NameNode, SeconeryNameNode,它们之间的通信方式有:
- Client----->NameNode,此时NameNode必须实现ClientProtocol。
- Client----->DataNode,此时DataNode必须实现ClientDatanodeProtocol。
- DataNode----->DataNode,此时DataNode必须实现InterDatanodeProtocol。
- DataNode----->NameNode,此时NameNode必须实现DatanodeProtocol。
- SeconeryNameNode----->NameNode,此时NameNode必须实现NamenodeProtocol。
- Client----->NameNode请求刷新认证信息,此时NameNode必须实现RefreshAuthorizationPolicyProtocol。
- Client----->NameNode请求属性用户,此时NameNode必须实现RefreshUserMappingsProtocol。同RefreshAuthorizationPolicyProtocol一样,仅仅把Client与NameNode通信的一两个方法单独出去而已。
- 所以
class DataNode implements InterDatanodeProtocol, ClientDatanodeProtocol class NameNode implements ClientProtocol, DatanodeProtocol, NamenodeProtocol, RefreshAuthorizationPolicyProtocol, RefreshUserMappingsProtocol
五.扩展性
- 为什么Hadoop这么设计通信机制,其实我认为这样的通信机制并不好理解。
- 扩展性
- 如果我自己开发一个发行版,新增加了一个角色BackUpNameNode, 显然,BackUpNameNode------>NameNode,那NameNode再实现一个BackUpNameNodeProtocol接口足以。
- 看看Yarn新增加的协议接口