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

  • 相关阅读:
    HBase 高性能加入数据
    Please do not register multiple Pages in undefined.js 小程序报错的几种解决方案
    小程序跳转时传多个参数及获取
    vue项目 调用百度地图 BMap is not defined
    vue生命周期小笔记
    解决小程序背景图片在真机上不能查看的问题
    vue项目 菜单侧边栏随着右侧内容盒子的高度实时变化
    vue项目 一行js代码搞定点击图片放大缩小
    微信小程序进行地图导航使用地图功能
    小程序报错Do not have xx handler in current page的解决方法
  • 原文地址:https://www.cnblogs.com/hujunfei/p/3518704.html
Copyright © 2011-2022 走看看