整体流程:
1. 设置系统关闭或中断时的日志处理
2. 创建NameNode前检查启动选项
1)
创建HdfsConfiguration,增加DeprecatedKeys,适配非标准的配置Key;标记hdfs-default.xml和hdfs-site.xml,但不读取文件和配置项
2) 获取命令行参数,设置命令行参数
3) 设置命令行参数
4) 检查设置HA时,不允许UPGRADE
5) 检查startOpt选项(之后有时间再分析一下启动选项)
3. 创建NameNode,执行join()
流程的重点在于创建NameNode这一块,以下详细分析
创建NameNode
1. 代码1252行,分两步走,先初始化再创建
DefaultMetricsSystem.initialize("NameNode");
return new NameNode(conf);
}
2. DefaultMetricsSystem
作用:监控系统运行?自己理解的
以枚举实现单例模式,参考Effective Java
启动Monitor。。。详细分析待续
启动MBean系统监控
3. NameNode
作用:生成NameNode
读取配置项————注:首次取配置项时读取配置整个文件
1) 配置项对象和配置角色
2) 命名服务ID:
a. 读取dfs.nameservice.id,成功则返回;
b. 读取dfs.nameservices;若该项只有一个值,则返回;
c. 读取dfs.ha.namenode.id(以下以<配置NNid>表示);
读取dfs.nameservices列表<NSids>,根据结果读取dfs.ha.namenodes.<nameserviceid>列表,为<NNids>。
若<配置NNid>不为空,根据列表结果与<配置NNid>对比,相等则继续;若<配置NNid>为空则继续。
读取dfs.namenode.rpc-address.<NSid>.<NNid>为目标地址
将目标地址解析为URI。若该URI只包含主机/IP地址:端口,不包含协议头,则target中不能包含路径,否则报错。
若目标地址超过一个,报错。若非本地地址,报错。
返回<NSid>
3) 命名结点ID:与命名服务ID类似
4) HaEnabled:
根据dfs.namenode.rpc-address前缀获取所有RPC服务地址。
判断当前NSid是否包含多个NNid
Map<String, Map<String, InetSocketAddress>> addresses =
DFSUtil.getHaNnRpcAddresses(conf);
if (addresses == null) return false;
Map<String, InetSocketAddress> nnMap = addresses.get(nsId);
return nnMap != null && nnMap.size() > 1;
}
5) state:
return !haEnabled ? ACTIVE_STATE : STANDBY_STATE;
}
6) allowStaleStandbyReads:
读取dfs.ha.allow.stale.reads,设置是否在standby状态下允许读。目前只供测试
7) haContext:
生成hacontext对象
8) 初始化:
a. initializeGenericKeys 。。。待补充
b. initialize:
UserGroupInformation.setConfiguration(conf); // 设置UGI静态配置,主要是安全认证机制和组查找服务
loginAsNameNodeUser(conf); // 使用命名结点用户登录
NameNode.initMetrics(conf, this.getRole()); // 初始化metrics
if (NamenodeRole.NAMENODE == role) { // 初始化http服务,验证配置
startHttpServer(conf);
validateConfigurationSettingsOrAbort(conf);
}
loadNamesystem(conf); // 加载命名服务
rpcServer = createRpcServer(conf); // 创建RPC服务器
if (NamenodeRole.NAMENODE == role) { // 设置http服务器命名结点地址和文件系统镜像
httpServer.setNameNodeAddress(getNameNodeAddress());
httpServer.setFSImage(getFSImage());
} else {
validateConfigurationSettingsOrAbort(conf);
}
startCommonServices(conf); // 启动通用服务
}
各服务的作用。。。待续
c. 启动前准备和启动服务
。。。待续
参考: