Hadoop的NameNode在启动时都做了哪些事情?源码解析


以hadoop3.x版本为例

namenode启动时大致有6个步骤

  • 1)首先启动9870端口
  • 2)启动完端口之后开始加载镜像文件和编辑日志
  • 3)紧接着创建RPC服务
  • 4)然后开始对NameNode的资源进行检测
    • 检测当前磁盘空间是否能够启动NameNode
    • 要检查镜像文件和编辑日志的路径上能存储多少内容,默认大小是100M,如果当前磁盘空间小于100M,就要进行警告
  • 5)对DataNode的心跳进行校验
    • 心跳检测时如果DateNode超过10分钟30秒没有被检测到,就认为DateNode宕机
  • 6)判断是否进入安全模式
    • 默认block块加载到99.9%之后离开安全模式
      (img-Nimvgvlm-1617721644025)(https://i.loli.net/2021/04/06/qKF4bMSUvWwaftE.png)]

下面手把手带着大家跟进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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值