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_* 文件中。