首页 百科知识 源代码分析(二七)

源代码分析(二七)

时间:2022-09-22 百科知识 版权反馈
【摘要】:我们接下来分析NameNode.java的成员变量,然后两个类综合起来,分析它提供的接口,并配合说明接口上请求对应的处理流程。下面我们来看NameNode的启动过程。NameNode的构造函数会调用initialize,初始化NameNode的成员变量,包括创建RPC服务器,初始化FSNamesystem,启动RPC服务器和回收站线程。对应于initialize方法,NameNode也提供了对应的stop方法,用于初始化时出错系统能正确地退出。我们在分析FSImage.java时,已经了解了这部分的功能。

我们接下来分析NameNode.java的成员变量,然后两个类综合起来,分析它提供的接口,并配合说明接口上请求对应的处理流程。

前面已经介绍过了,NameNode实现了接口ClientProtocol,DatanodeProtocol和NamenodeProtocol,分别提供给客户端/DataNode/从NameNode访问。由于NameNode的大部分功能在类FSNamesystem中实现,那么NameNode.java的成员变量就很少了。

  publicFSNamesystem namesystem;
指向FSNamesystem对象。

 

  privateServer server;
NameNodeRPC服务器实例。

 

  privateThread emptier;
处理回收站的线程句柄。

 

  privateint handlerCount = 2;
还记得我们分析RPC的服务器时提到的服务器请求处理线程(Server.Handle)吗?这个参数给出了server中服务器请求处理线程的数目,对应配置参数为dfs.namenode.handler.count

 

  privateboolean supportAppends = true;
是否支持append操作,对应配置参数为dfs.support.append

  privateInetSocketAddress nameNodeAddress = null;
NameNode地址,包括IP地址和监听端口。

下面我们来看NameNode的启动过程。main方法是系统的入口,它会调用createNameNode创建NameNode实例。createNameNode分析命令行参数,如果是FORMAT或FINALIZE,调用对应的方法后退出,如果是其他的参数,将创建NameNode对象。NameNode的构造函数会调用initialize,初始化NameNode的成员变量,包括创建RPC服务器,初始化FSNamesystem,启动RPC服务器和回收站线程。

FSNamesystem的构造函数会调用initialize方法,去初始化上面我们分析过的一堆成员变量。几个重要的步骤包括加载FSImage,设置系统为安全模式,启动各个工作线程和HTTP服务器。系统的一些参数是在setConfigurationParameters中初始化的,其中一些值的计算比较麻烦,而且也可能被其它部分的code引用的,就独立出来了,如getNamespaceDirs和getNamespaceEditsDirs。initialize对应的是close方法,很简单,主要是停止initialize中启动的线程。

对应于initialize方法,NameNode也提供了对应的stop方法,用于初始化时出错系统能正确地退出。

NameNodeformatfinalize操作,都是先构造FSNamesystem,然后利用FSNamesystemFSImage提供的对应方法完成的。我们在分析FSImage.java时,已经了解了这部分的功能。


免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈