以hadoop3.x版本为例
namenode启动时大致有6个步骤
- 1)首先启动9870端口
- 2)启动完端口之后开始加载镜像文件和编辑日志
- 3)紧接着创建RPC服务
- 4)然后开始对NameNode的资源进行检测
- 检测当前磁盘空间是否能够启动NameNode
- 要检查镜像文件和编辑日志的路径上能存储多少内容,默认大小是100M,如果当前磁盘空间小于100M,就要进行警告
- 5)对DataNode的心跳进行校验
- 心跳检测时如果DateNode超过10分钟30秒没有被检测到,就认为DateNode宕机
- 6)判断是否进入安全模式
- 默认block块加载到
99.9%
之后离开安全模式
- 默认block块加载到
下面手把手带着大家跟进NameNode启动源码
ctrl + n搜索namenode,找到namenode的main方法
1.启动9870端口服务
public static void main(String argv[]) throws Exception {
NameNode namenode = createNameNode(argv, null);
}
进入createNameNode方法,nameNode中new了一个Namenode对象
public static NameNode createNameNode(String argv[], Configuration conf) throws IOException {
return new NameNode(conf);
}
}
进入Namenode,在里面进行了初始化
public NameNode(Configuration conf) throws IOException {
this(conf, NamenodeRole.NAMENODE);
}
protected NameNode(Configuration conf, NamenodeRole role) throws IOException {
initialize(getConf());
}
进入initialize(getConf())
,初始化时启动了http服务
protected void initialize(Configuration conf) throws IOException {
if (NamenodeRole.NAMENODE == role) {
startHttpServer(conf);
}
loadNamesystem(conf);
}
进入startHttpServer(conf)
,启动http服务时,要获取端口号
private void startHttpServer(final Configuration conf) throws IOException {
httpServer = new NameNodeHttpServer(conf, this, getHttpServerBindAddress(conf));
httpServer.start();
httpServer.setStartupProgress(startupProgress);
}
-
进入
getHttpServerBindAddress(conf)
-
protected InetSocketAddress getHttpServerBindAddress(Configuration conf) { InetSocketAddress bindAddress = getHttpServerAddress(conf); }
-
进入
getHttpServerAddress(conf)
-
protected InetSocketAddress getHttpServerAddress(Configuration conf) { return getHttpAddress(conf); }
-
进入
getHttpAddress(conf)
-
public static InetSocketAddress getHttpAddress(Configuration conf) { return NetUtils.createSocketAddr( conf.getTrimmed(DFS_NAMENODE_HTTP_ADDRESS_KEY, DFS_NAMENODE_HTTP_ADDRESS_DEFAULT)); }
-
进入
DFS_NAMENODE_HTTP_ADDRESS_DEFAULT
-
public static final String DFS_NAMENODE_HTTP_ADDRESS_DEFAULT = "0.0.0.0:" + DFS_NAMENODE_HTTP_PORT_DEFAULT;
-
进入
DFS_NAMENODE_HTTP_PORT_DEFAULT
-
public static final int DFS_NAMENODE_HTTP_PORT_DEFAULT = HdfsClientConfigKeys.DFS_NAMENODE_HTTP_PORT_DEFAULT;
-
进入
DFS_NAMENODE_HTTP_PORT_DEFAULT
,就看到了9870端口 -
int DFS_NAMENODE_HTTP_PORT_DEFAULT = 9870;
-
调用httpServer.start()
启动http服务,setupServlets(httpServer, conf)
void start() throws IOException {
setupSe