|
声明:个人原创,转载请注明出处。文中引用了一些网上或书里的资料,如有不妥之处请告之。
本文是我阅读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 |
|
|