• HDFS源码分析之NameNode(1)————启动过程


    源码:2.8.0

    入口类:org.apache.hadoop.hdfs.server.namenode.NameNode

    main方法会调用createNameNode 创建 NameNode 实例,如果是 FORMAT 戒 FINALIZE,调用对应的方法后退出,如果是其他的参数,将创建NameNode 对象。创建的服务如下:

    服务                             类                              
    server                   ipc.RPC.Server      server.namenode.NameNodeRpcServer
    serviceRpcServer         ipc.RPC.Server    
    HttpServer               http.HttpServer    
    Trash Emptier            fs.Trash.Trash.Emptier    
    hbthread                 hdfs.server.namenode.FSNamesystem.HeartbeatMonitor      
    lmthread                 hdfs.server.namenode.LeaseManager.Monitor    
    replthread               hdfs.server.namenode.FSNamesystem.ReplicationMonitor    
    dnthread                 hdfs.server.namenode.DecommissionManager.Monitor  
    

      

    初始化步骤如下:

    分析启动模式: Format(格式化NameNode元数据及日志信息)

    // Parse the rest, NN specific args.
        StartupOption startOpt = parseArguments(argv);
        if (startOpt == null) {
          printUsage(System.err);
          return null;
        }
        setStartupOption(conf, startOpt);

    准备工作:

    setClientNamenodeAddress(conf);  //设置clients访问nomenode或nameservice的访问地址  配置项fs.defaultFS  

    1.初始化登录认证,如果HADOOP开启了Kerberos认证,则进行认证。

    UserGroupInformation.setConfiguration(conf);
    loginAsNameNodeUser(conf);

    认证的配置信息来自hdfs-site.xml

    配置项
    Dfs.namenode.keytab.file		     	#keytab文件
    Dfs.namenode.kerberos.principal	          #kerberos认证个体

    最后调用接口进行认证

    //UserGroupInformation管理用户登录
    UserGroupInformation.loginUserFromKeytab(principalName, keytabFilename);
    

      

    2.如果当前启动的NameNode角色是启用状态,启动HTTPServer服务

        if (NamenodeRole.NAMENODE == role) {
          startHttpServer(conf);
        }
    

      

    3.创建RPCServer

    rpcServer = createRpcServer(conf);

    创建过程如下:

    #初始化NameNode线程数,dfs.namenode.handler.count 默认10
    int handlerCount = 
          conf.getInt(DFS_NAMENODE_HANDLER_COUNT_KEY, 
                      DFS_NAMENODE_HANDLER_COUNT_DEFAULT);
    
    #设置初始化的RPC Engine 
    RPC.setProtocolEngine(conf, ClientNamenodeProtocolPB.class,
            ProtobufRpcEngine.class);

    NameNodeRpcServer实现NamenodeProtocols  支持以下Rpc调用

    public interface NamenodeProtocols
      extends ClientProtocol,
              DatanodeProtocol,
              DatanodeLifelineProtocol,
              NamenodeProtocol,
              RefreshAuthorizationPolicyProtocol,
              RefreshUserMappingsProtocol,
              RefreshCallQueueProtocol,
              GenericRefreshProtocol,
              GetUserMappingsProtocol,
              HAServiceProtocol,
              TraceAdminProtocol {
    }

    NameNodeRpcServer

      /** The RPC server that listens to requests from DataNodes 
        ##Address配置:dfs.namenode.servicerpc-address 默认8022
        ##dfs.namenode.service.handler.count 处理线程数
      */
      private final RPC.Server serviceRpcServer;
      private final InetSocketAddress serviceRPCAddress;
    
      /** The RPC server that listens to lifeline requests 
       #
    dfs.namenode.lifeline.rpc-address 默认50070*/
      private final RPC.Server lifelineRpcServer;
      private final InetSocketAddress lifelineRPCAddress;
      
      /** The RPC server that listens to requests from clients
        dfs.namenode.rpc-bind-host 默认8020*/
    protected final RPC.Server clientRpcServer; 
    protected final InetSocketAddress clientRpcAddress;
  • 相关阅读:
    在 mac iTerm2 中使用 cmd 终端
    在 jupyter 中添加菜单和自动完成功能
    Bash 和 Zsh 开启 vi-mode
    免密登录和远程执行命令
    图片的筛选
    win10 右键菜单很慢的解决方式
    ssh中的 Connection closed by ***
    NodeJS 获取网页源代码
    在 JSDOM v11 中使用jQuery
    kafaka学习
  • 原文地址:https://www.cnblogs.com/Dhouse/p/6890141.html
Copyright © 2020-2023  润新知