NameNode.Main()函数
1、调用startupShutdownMessage输出启动、停止日志信息;
2、创建namenode:通过调用createNameNode(args,null)方法来创建实例;
3、createNameNode函数内部:
a、判断配置信息对象configuration是否已经实例化,若为实例化,则进行创建对象实例化;
b、解析输入参数,调用parseArgumengs(args)来实现,实例化StartupOPtion,若参数为空,直接返回;
c、赋值变量setStartupOption()
d、判断在HA情况下,若输入参数中存在upgrade、rollback、finalize则直接异常,报在HA情况下不能进行这些操作;
e、switch语句,根据常量值判断是何种操作:FORMAT、GENCLUSTERID、FINALIZE、BOOTSTRAPSTANDBY、INITIALIZESHARDEDITS、BACKUP、CHECKPOINT、RECOVERY等操作。
此时是FORMAT操作,调用format(conf,force,isInteractive),在该函数内部进行目录验证及格式化;
f、在该函数内部,
a、调用DFSUtil.getNamenodeNameServiceId(conf)获取nameserviceId,在该函数内部首先根据属性信息dfs.nameservice.id取获取conf中的配置信息(默认为空),若用户配置了,直接返回;否则,取属性dfs.nameservices对应的数据,若该返回值得集合列表的大小为1,则直接返回该数据,否则,获取dfs.ha.namenode.id对应的数据,然后调用函数getSuffixIDs(…)进行获取;
b、调用HAUtil.getNamenodeId(conf,nameserviceId)来获取namenodeId,在该函数内部,首先获取dfs.ha.namenode.id属性的对应的数据,若该数据存在,直接返回该数值,否则,调用DFSUtil.getSuffixIDs(…)函数,在该函数内部,首先获取dfs.nameservices属性对应的数据集合nsids,遍历该集合,比较传递过来的nameserviceId和获取到dfs.nameservices属性的数据是否一致,若不一致,则namenodeId为空,一致的话,紧接着获取dfs.ha.namenodes.($nameserviceId)属性对应的数据集合nnids,遍历集合nnids,拼接key:dfs.namenode.rpc-address.$nameserviceId.$nnid,获取该属性对应的数据,在此该属性为dfs.namenode.rpc-address.hdpha.nn1对应的数据为master-active:8020,查看是否与本地机器地址匹配,若匹配,则namenodeId赋值为该$nnid对应的数据,遍历完成后,返回nameserviceId和nnid对应的数组;
c、调用initializeGenericKeys(conf,nameserviceId,nnId)来获取当前集群的配置属性,以NameNode对象内部定义的两个数组NAMENODE_SPECIFIC_KEYS和NAMESERVICE_SPECIFIC_KEYS内容为前缀,nameserviceId+”.”+nnId为后缀的自定义属性集合;
d、调用checkAllowFormat(conf)来根据属性dfs.namenode.support.allow.format数值来判断是否允许格式化,默认的数值为true;
e、获取dfs.namenode.name.dir和dfs.namenode.shared.edits.dir对应的数据集合nameDirsToFormat、sharedDirs和editDirsToFormat;
f、获取clusterId,若参数中未指定,手动生成,格式为以”CID-”+UUID.randomUUID().toString();
g、构建FSImage对象,new FSImage(conf,nameDirsToFormat,editDirsToFormat),该类主要是处理名称空间的检查点和日志编辑,在该构造器的内部,根据输出参数构造FSEditLog,NNStorage,NNStorageRetentionManager实例, 检查点设置默认目录,设置存储和初始化编辑日志。
FSEditLog:维护一个命名空间的日志修改
NNStorage:是NameNode用来管理使用StorageDirectories的
NNStorageRetentionManager:负责检查存储目录的网络结构和执行检查点和编辑日志保留政策。它代表的实际删除文件StoragePurger实现,这可能会删除文件或复制他们而不是编档人员或HDFS供以后分析。
h、构建FSNamesystem对象,根据FSImage对象来创建。
FSNamesystem主要的是负责DataNode的记账工作,它主要跟踪如下几张表:
1、有效fsname - - >过滤清单(保存在磁盘上,记录)
2、组所有有效的块
3、块- - > machinelist(保存在内存中,重建动态报告)
4、机- - >过滤清单
5、LRU缓存updated-heartbeat机器
在FSNamesystem构造函数内部创建了对象FSDirectory对象,
FSDirectory存储文件系统目录的状态,它处理/加载值写入磁盘,和日志记录,它使文件名到仿真映射总是最新的,并记录到磁盘。
i、调用FSEditLog对象的initJournalForWrite()
j、调用FSImage对象的format(fsn,clusterId)来进行hdfs格式化操作.
1、校验文件数是否为1,若是直接报错:FSImage.format should be called with an uuinilialized namesystem.
2、创建NamespaceInfo对象,创建nsid(namespaceid),clusterId,bdid(blockpoolid)
3、调用NNStorage对象的format(namespaceInfo)方法:格式化所有的存储目录
a、删除配置dfs.namenode.name.dir属性文件目录下的current目录并重建
b、将namespaceInfo对象属性信息写到VERSION文件中
c、将checkpoint的时间点写到seen_txid文件中
4、调用FSEditLog对象的FormatNonFileJournals(ns),格式化所有不以文件为基础的journals(记录).
5
、调用
FSImage
对象的
saveFSImageInAllDirs(fsn,0)
异步运行一系列的
FSImageServer
线程将
FSImage
信息写到
current
目录下的
fsimage_*
文件中。