SecondaryNameNode有两个作用,一是镜像备份,二是日志与镜像的定期合并。两个过程同时进行,称为checkpoint。
1.首先分析SecondaryNameNode的创建过程,主要的初始化逻辑在SecondaryNameNode.initialize(Configuration conf)方法中:
1.1)从配置文件中获取参数"dfs.namenode.servicerpc-address"的值(是NameNode的地址),若此地址为空,则获取"dfs.namenode.rpc-address"的值,若仍然为空,则取"fs.default.name"的值作为缺省值;1.2)根据上一步得到的地址通过【RPC.waitForProxy(....)】创建NameNode对象,并赋值给SecondaryNameNode.namenode变量;
1.3)获取参数"fs.checkpoint.dir"值(为checkpoint目录),缺省为"/tmp/hadoop/dfs/namesecondary",对N个目录初始化File对象,并赋值给SecondaryNameNode.checkpointDirs:Collection<File>对象;
1.4)获取参数"fs.checkpoint.edits.dir"值(为checkpoint的edit文件目录),缺省为"/tmp/hadoop/dfs/namesecondary",对N个目录初始化File对象,并赋值给SecondaryNameNode.checkpointEditsDirs:Collection<File>对象;
1.5)【new CheckpointStorage()】初始化CheckpointStorage对象并赋值给SecondaryNameNode.checkpointImage变量,此类继承FSImage类;
1.6)【CheckpointStorage.recoverCreate(Collection<File> checkpointDirs, Collection<File> checkpointEditsDirs)】,根据checkpointDirs和checkpointEditsDirs来设置(Storage)FSImage.storageDirs队列的值,逻辑与创建NameNode中第二.3.2步一样;
1.7)获取参数"fs.checkpoint.period"和"fs.checkpoint.size",分别表示checkpoint周期和checkpoint时edit文件的大小;赋值给SecondaryNameNode.checkpointPeriod和SecondaryNameNode.checkpointSize变量;
1.8)初始化HttpServer,赋值给SecondaryNameNode.infoServer变量并开启此服务:此服务注册了一个Servlet:httpServer.addInternalServlet("getimage", "/getimage",GetImageServlet.class, true, SecurityUtil.useKsslAuth());注册GetImageSe