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

  • 相关阅读:
    poj 3243 Clever Y(BabyStep GiantStep)
    poj 2417 Discrete Logging
    poj 3481 Double Queue
    hdu 4046 Panda
    hdu 2896 病毒侵袭
    poj 1442 Black Box
    hdu 2815 Mod Tree
    hdu 3065 病毒侵袭持续中
    hdu 1576 A/B
    所有控件
  • 原文地址:https://www.cnblogs.com/hujunfei/p/3518704.html
Copyright © 2011-2022 走看看