前几天在测试hadoop的时候,由于重复执行了NameNode - Format操作,中间发现一些问题,于是就研究了一下NameNode -- Format操作的过程,在这里记录一下。
NameNode在启动的时候会check meta和image的存储目录( dfs.namenode.name.dir )是否存在, 指定的目录不存在,就把报没有对应的目录而退出整个启动过程。而该初始化动作在format的时候进行。所以在搭建Hadoop环境时候需要对NameNode进行format操作。
format:
sudo -u hdfs hdfs namenode -format (如果在本地调试的时候加上-format运行参数)
format过程可以加下面几个参数:
-forc: 对已有的数据进行format时,跳过confirm操作,直接format。
-nonInteractive: 对已有的数据进行format时,跳过confirm操作,不进行format操作。
-clusterid: format的时候可以指定一个clusterid,如果没有指定系统为生产一个新的。
Format整个过程及原理:
通过配置文件初始化需要format的目录,整个format主要对dfs.namenode.name.dir, dfs.namenode.shared.edits.dir(HA)及dfs.namenode.edits.dir配置的目录进行format操作。该操作主要在NameNode.format这个方法中实现。
a) 其间为调用fsImage.getEditLog().initJournalsForWrite();来初始化整个日志系统(Edit Log)。其中包括本地文件系统与通过dfs.namenode.edits.journal-plugin配置的plugin。目前HDFS的EditLo文件可以存放在多种容器里,比如Local Filesystem, shared NFS, Bookkeeper等(其对应的日志管理接口分别定义FileJournalManager,BookkeeperJournalManager,BackupJournalManager等),而对应的管理这些不同容器内的文件的方法也有多种。
如果对已有的NameNode做format操作,需要处理confirm操作。NameNode.format-->FSImage.confirmFormat-->Storage.confirmFormat。
format过程:NameNode.format-->FSImage.format-->(NNStorage.format, FSEditLog.formatNonFileJournals,FSImage.saveFSImageInAllDirs)
//NameNode.format method source as below: