Hadoop RPC整个使用流程——以DataNode向NameNode注册为例

在HDFS实现过程中DataNode class中有一个成员变量namenode,其类型是DatanodeProtocol。namenode可以看作是远程NameNode服务器的一个代理,因为NameNode本身也是DatanodeProtocol接口的具体实现;DataNode通过调用namenode对象的方法与远程NameNode进行交互。

下面看一下namenode变量在DataNode当中是如何初始化的:

首先DataNode通过调用RPC.waiForProxy方法完成namenode的初始化过程,具体实现看下面的代码:

this.namenode = (DatanodeProtocol) RPC.waitForProxy(DatanodeProtocol.class,DatanodeProtocol.versionID,nameNodeAddr,conf);

通过上面的代码可以看出,具体namenode是如何与远程的NameNode进行连接的需要通过查阅RPC.waitForProxy(...)来查看。waitForProxy通过RPC内部的一系列方法调用,最终通过下面的getProxy方法来实现:

public static VersionedProtocol getProxy(
Class<? extends VersionedProtocol> protocol, 
  long clientVersion,
InetSocketAddress addr, 
  UserGroupInformation ticket,
Configuration conf, 
  SocketFactory factory,
  int rpcTimeout)throws IOException {

if (UserGroupInformation.isSecurityEnabled()) {
SaslRpcServer.init(conf);
}
VersionedProtocol proxy = (VersionedProtocol)                      Proxy.newProxyInstance(
protocol.getClassLoader(), 
  new Class[] { protocol },
new Invoker(protocol, addr, ticket, conf, factory,                      rpcTimeout));
long serverVersion =                                            proxy.getProtocolVersion(protocol.getName(),
clientVersion);
if (serverVersion == clientVersion) {
return proxy;
} else 
        {
throw new VersionMismatch(protocol.getName(),                  clientVersion,
serverVersion);
}
  }

(目前对Java Proxy的具体作用不是很了解。但是据猜测作用应该是这样的,Proxy产生了一个protocol的一个具体对象,但是对该对象所有方法的调用都是通过Invoker中的invoke方法来进行调用,也就是其最终的方法调用是通过Invoker的invoke方法进行实现的),其中Invoker是该方法的关键,我们看一下Invoker的具体实现:

Invoker是InvocationHandler接口的具体实现(Invoker implements InvocationHandler),其中必须实现的方法是:
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
final boolean logDebug = LOG.isDebugEnabled();
long startTime = 0;
if (logDebug) {
startTime = System.currentTimeMillis();
}

ObjectWritable value = (ObjectWritable) client.call(new Invocation(
method, args), remoteId);
if (logDebug) {
long callTime = System.currentTimeMillis() - startTime;
LOG.debug("Call: " + method.getName() + " " + callTime);
}
return value.get();
}

invoke方法通过调用client.call方法完成与远程服务器的调用,client是RPC Client的一个实例。RPC Client具体完成与远程服务器通过socket进行交互的功能。


http://www.linuxidc.com/Linux/2012-09/70999.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值