zoukankan      html  css  js  c++  java
  • Hadoop 2.2.0源码浏览:1. NameNode

    整体流程:

    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行,分两步走,先初始化再创建

          default: {
            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

      public static boolean isHAEnabled(Configuration conf, String nsId) {
        Map<String, Map<String, InetSocketAddress>> addresses =
          DFSUtil.getHaNnRpcAddresses(conf);
        if (addresses == nullreturn false;
        Map<String, InetSocketAddress> nnMap = addresses.get(nsId);
        return nnMap != null && nnMap.size() > 1;
      }

    5) state:

      protected HAState createHAState() {
        return !haEnabled ? ACTIVE_STATE : STANDBY_STATE;
      }

    6) allowStaleStandbyReads:

      读取dfs.ha.allow.stale.reads,设置是否在standby状态下允许读。目前只供测试

    7) haContext:

      生成hacontext对象

    8) 初始化:

     a. initializeGenericKeys 。。。待补充

     b. initialize:

      protected void initialize(Configuration conf) throws IOException {
        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. 启动前准备和启动服务

    。。。待续

    参考:

    http://blog.csdn.net/heipacker/article/details/12978575

  • 相关阅读:
    Python: Best Way to Exchange Keys with Values in a Dictionary?
    install pymssql on centos
    centos 5.5 deploy full procedure
    centos 5.5 deploy full procedure
    change defaut python to 2.6.5 on centos
    Python: Best Way to Exchange Keys with Values in a Dictionary?
    install eventlet ,redis,dreque on centos
    install freetds on centos
    use alias
    install eventlet ,redis,dreque on centos
  • 原文地址:https://www.cnblogs.com/hujunfei/p/3518704.html
Copyright © 2011-2022 走看看