设为首页 收藏本站
查看: 944|回复: 0

[经验分享] Hadoop RPC整个使用流程——以DataNode向NameNode注册为例

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-6-6 11:08:20 | 显示全部楼层 |阅读模式

在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进行交互的功能。




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-20275-1-1.html 上篇帖子: 轻松使用Hadoop RPC 下篇帖子: Hadoop RPC详细分析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表