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

[经验分享] 细水长流Hadoop源码分析(3)RPC Server初始化启动过程

[复制链接]

尚未签到

发表于 2015-7-12 00:16:36 | 显示全部楼层 |阅读模式
  声明:个人原创,转载请注明出处。文中引用了一些网上或书里的资料,如有不妥之处请告之。
  本文是我阅读Hadoop 0.20.2第二遍时写的笔记,在阅读过程中碰到很多问题,最终通过各种途径解决了大部分。Hadoop整个系统设计精良,源码值得学习分布式的同学们阅读,以后会将所有笔记一一贴出,希望能方便大家阅读源码,少走弯路。

  目录
  4 RPC服务器(org.apache.hadoop,ipc.Server)
  4.1 服务器初始化


4 RPC服务器(org.apache.hadoop,ipc.Server)

4.1 服务器初始化
  在org.apache.hadoop.hdfs.server.namenode.NameNode.initialize方法里有创建和启动RPC服务器的代码,所以RPC服务器的初始化从这个方法开始:



this.server = RPC.getServer(this, socAddr.getHostName(), socAddr.getPort(),
handlerCount, false, conf);
this.server.start();  //start RPC server
  PPC.getServer方法返回Server类型的对象,实际返回的类型是RPC.Server类的对象,这就是RPC服务器。实际上,RPC.getServer方法将参数原封不动地传给RPC.Server的构造方法。在继续跟踪RPC.Server对象的构造方法之前,先来看看RPC.getServer方法的参数:

  RPC.getServer参数

  值

  说明

  Object instance

  this = NameNode类对象

  NameNode实现了众多协议接口,可作为RPC服务器实例

  String bindAddress

  socAddr.getHostName()=localhost

  NameNode RPC服务器监听IP地址

  int port

  socAddr.getPort()=9000

  NameNode RPC服务器监听端口号

  numHandlers

  handlerCount=10

  RPC服务器中的Handler线程数

  verbose

  false

  是否对每次远程调用记录日志,这里表示不记录

  conf

  conf

  全局配置

  RPC.Server类相对于其父类增加了三个数据成员:instance、verbose和authorize。instance指实现协议接口的实例,verbose指是否将每次远程过程调用记录到日志,authorize指是否对每次远程过程调用执行权限检查。默认情况下,verbose和authorize均设为false,表示不记录日志,也不进行权限验证,这就是Hadoop不安全的地方。这是RPC.Server类的构造方法:



public Server(Object instance, Configuration conf, String bindAddress,
int port,int numHandlers, boolean verbose) throws IOException {
super(bindAddress,port,Invocation.class,
numHandlers, conf, classNameBase(instance.getClass().getName()));
this.instance = instance;
this.verbose = verbose;
this.authorize = conf.getBoolean(
ServiceAuthorizationManager.SERVICE_AUTHORIZATION_CONFIG, false);
}
  这个构造方法里除了初始化自己的三个成员之外,就是调用父类的构造方法了。向父类的构造方法传递的参数有两个新参数,一个是Invocation.class,表示远程调用的参数数据类型,另一个是instance的类名称。这里之所以对instance的类名称进行classNameBase操作,是因为调用Class.getName方法可能会得到java.lang.String这样的名称,所以要取这个名称的最后一部分。
  org.apache.hadoop.ipc.Server类是RPC服务器的核心,其重要的数据成员如下:

[table]

[tr]
[td=1,1,359]  成员

[/td]
[td=1,1,716]  说明

[/td]
[/tr]
[tr]
[td=1,1,359]  static ThreadLocal SERVER

[/td]
[td=1,1,716]  表示当前正在运行的RPC Server的对象,也就是Listener、Responder或Handler(这些都是内部类)的run方法设置的Server.this(这种“类名.this”用于内部类引用外部类对象时,内部类的this指自身对象)。
  Hadoop允许不同线程运行不同的RPC Server,所以对于静态成员,又不能让线程间共享,就要加个ThreadLocal声明其为线程局部变量了

[/td]
[/tr]
[tr]
[td=1,1,359]  static ConcurrentHashMap

运维网声明 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-85565-1-1.html 上篇帖子: hadoop client与datanode的通信原理 下篇帖子: Hadoop之RPC
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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