第二部分代码如下,主要根据配置文件获取要格式化的目录、存储edits日志的目录等,以及在未指定clusterId的情况生成新的clusterId用于标识命名空间。
/*获取参数dfs.namenode.name.dir设置的目录,该值用于存储fsimage
*默认值为file://${Hadoop.tmp.dir}/dfs/name,
*其中hadoop.tmp.dir定义在core-default.xml中,值为/tmp/hadoop-${user.name}
*/
Collection nameDirsToFormat = FSNamesystem.getNamespaceDirs(conf);
/*获取在primary和secondary namenode之间共享的edits目录
*相应的参数为dfs.namenode.shared.edits.dir
*/
List sharedDirs = FSNamesystem.getSharedEditsDirs(conf);
List dirsToPrompt = new ArrayList();
dirsToPrompt.addAll(nameDirsToFormat);
dirsToPrompt.addAll(sharedDirs);
/*获取保存edits的目录,对应的参数为dfs.namenode.edits.dir
*若上面的参数没有配置,则使用与fsimage一致的目录
*/
List editDirsToFormat = FSNamesystem.getNamespaceEditsDirs(conf);
// if clusterID is not provided - see if you can find the current one
String clusterId = StartupOption.FORMAT.getClusterId();
if(clusterId == null || clusterId.equals("")) {
//Generate a new cluster id
clusterId = NNStorage.newClusterID();
}
System.out.println("Formatting using clusterid: " + clusterId);
最后一部分代码执行了创建fsimage和edits文件的工作,由于这两个文件的创建可以做为单独的源码分析进行,在此就不进行详细地分析,会有专门的文章学习这部分代码。
FSImage fsImage = new FSImage(conf, nameDirsToFormat, editDirsToFormat);
try {
FSNamesystem fsn = new FSNamesystem(conf, fsImage);
fsImage.getEditLog().initJournalsForWrite();
if (!fsImage.confirmFormat(force, isInteractive)) {
return true; // aborted
}
fsImage.format(fsn, clusterId);
现在已经分析完了执行hdfs namenode –format命令时都执行了哪些操作,其实就是根据配置文件中的特定参数如dfs.namenode.name.dir等,将fsimage和edits文件写入这些目录,而fsimage和edits文件的创建及格式等分析见 :http://www.linuxidc.com/Linux/2014-09/107139.htm。