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

Hadoop 2.2.0源码浏览:1. NameNode
  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;
  }
Hadoop 2.2.0源码浏览:1. NameNode

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:

Hadoop 2.2.0源码浏览:1. NameNode
  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);  // 启动通用服务 
  }
Hadoop 2.2.0源码浏览:1. NameNode

各服务的作用。。。待续

 c. 启动前准备和启动服务

 

。。。待续

参考:

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

Hadoop 2.2.0源码浏览:1. NameNode

上一篇:Cheatsheet: 2014 01.01 ~ 01.14


下一篇:python学习day16