在配置Hadoop环境后,第一次启动NameNode节点之前,需要使用命令hadoop namenode -format对NameNode节点进行格式化,那么这个格式化的过程是怎么样的呢?这篇文章就来分析NameNode格式化的过程。
NameNode格式化过程
NameNode节点以参数-format启动之后,会进入NameNode.createNameNode()方法,在这个方法中有一个switch语句,其中有一项就是FORMAT,switch语句代码如下:
switch (startOpt) {
case FORMAT:
boolean aborted = format(conf, startOpt.getConfirmationNeeded(),
startOpt.getInteractive());
System.exit(aborted ? 1 : 0);
case FINALIZE:
aborted = finalize(conf, true);
System.exit(aborted ? 1 : 0);
case RECOVER:
NameNode.doRecovery(startOpt, conf);
return null;
default:
}
可见,如果以-format参数启动,就会进入到NameNode.format()方法,对NameNode节点进行格式化。NameNode.format()方法的代码如下:
private static boolean format(Configuration conf,
boolean isConfirmationNeeded, boolean isInteractive) throws IOException {
Collection<File> dirsToFormat = FSNamesystem.getNamespaceDirs(conf);//保存命名空间镜像目录
Collection<File> editDirsToFormat =
FSNamesystem.getNamespaceEditsDirs(conf);//保存编辑日志目录
for(Iterator<File> it = dirsToFormat.iterator(); it.hasNext();) {
File curDir = it.next();
if (!curDir.exists())
continue;//目录不存在
if (isConfirmationNeeded) {//目录存在
if (!isInteractive) {
System.err.println("Format aborted: " + curDir + " exists.");
return true;
}
System.err.print("Re-format filesystem in " + curDir +" ? (Y or N) ");//提示用户确认删除
if (!(System.in.read() == 'Y')) {
System.err.println("Format aborted in "+ curDir);
return true;
}
while(System.in.read() != '\n'); // discard the enter-key
}
}
FSNamesystem nsys = new FSNamesystem(new FSImage(dirsToFormat,
editDirsToFormat), conf);
nsys.dir.fsImage.format();
return false;
}
NameNode.format()方法有三个参数,第一个参数是配置信息,第二个参数和第三个参数分别通过StartupOption.getConfirmationNeeded()方法和StartupOption.getInteractive()方法获得,即获取StartupOption枚举中的isConfirmationNeeded和isInteractive这两个成员变量的值。在Hadoop源码分析之NameNode的启动与停止这篇文章中分析过NameNode的启动参数,-force参数的用法是java NameNode [-format [ -force ] [-nonInteractive]]。可以看到NameNode的启动参数-format还可以带有两个启动参数,这里称为子参数吧!isConfirmationNeeded和isInteractive这两个成员变量分别对应着force和nonInteractive,其中nonIntera