`
zhangjun5965
  • 浏览: 12286 次
社区版块
存档分类
最新评论

hadoop源码学习之namenode启动

阅读更多

 

概述

hdfs主要包括两类节点,namenode和datanode,所以hdfs的启动也就是这两类节点的启动. namenode管理者所有的datanode信息、数据块信息等,它是整个hdfs的核心,首先要启动namenode,然后再启动datanode。

namenode格式化

namenode的class是org.apache.hadoop.hdfs.server.namenode.NameNode,位于hadooop-hdfs项目中,入口方法是main方法,main方法调用了静态方法createNameNode来创建namenode。

在createNameNode方法中,通过switch中的参数来判断做格式化、升级、启动等操作,代码如下:

switch (startOpt) {
      case FORMAT: {
        boolean aborted = format(conf, startOpt.getForceFormat(),
            startOpt.getInteractiveFormat());
        terminate(aborted ? 1 : 0);
        return null; // avoid javac warning
      }
      case GENCLUSTERID: {
        System.err.println("Generating new cluster id:");
        System.out.println(NNStorage.newClusterID());
        terminate(0);
        return null;
      }
      case FINALIZE: {
        System.err.println("Use of the argument '" + StartupOption.FINALIZE +
            "' is no longer supported. To finalize an upgrade, start the NN " +
            " and then run `hdfs dfsadmin -finalizeUpgrade'");
        terminate(1);
        return null; // avoid javac warning
      }
      case ROLLBACK: {
        boolean aborted = doRollback(conf, true);
        terminate(aborted ? 1 : 0);
        return null; // avoid warning
      }
      case BOOTSTRAPSTANDBY: {
        String toolArgs[] = Arrays.copyOfRange(argv, 1, argv.length);
        int rc = BootstrapStandby.run(toolArgs, conf);
        terminate(rc);
        return null; // avoid warning
      }
      case INITIALIZESHAREDEDITS: {
        boolean aborted = initializeSharedEdits(conf,
            startOpt.getForceFormat(),
            startOpt.getInteractiveFormat());
        terminate(aborted ? 1 : 0);
        return null; // avoid warning
      }
      case BACKUP:
      case CHECKPOINT: {
        NamenodeRole role = startOpt.toNodeRole();
        DefaultMetricsSystem.initialize(role.toString().replace(" ", ""));
        return new BackupNode(conf, role);
      }
      case RECOVER: {
        NameNode.doRecovery(startOpt, conf);
        return null;
      }
      case METADATAVERSION: {
        printMetadataVersion(conf);
        terminate(0);
        return null; // avoid javac warning
      }
      case UPGRADEONLY: {
        DefaultMetricsSystem.initialize("NameNode");
        new NameNode(conf);
        terminate(0);
        return null;
      }
      default: {
        DefaultMetricsSystem.initialize("NameNode");
        return new NameNode(conf);
      }
    }

namenode启动之前需要先进行格式化操作,格式化的主要目的就是初始化namenode的数据目录,初始化集群的id、版本等,会在配置的目录写入相应的属性文件.

格式化的主要方法是namenode中的format方法,在这里主要从配置文件中读取相应的配置,做一些相应的检查,然后构造了两个hdfs非常核心的类FSImage、FSNamesystem。

( FSImage:在硬盘中存储着hdfs系统的元数据,保存着在某一个时刻hdfs的镜像,后续的各种实时的操作记录在FSEditLog类中。

FSNamesystem :FSNamesystem does the actual bookkeeping work for the DataNode,这个注释很好的解释了FSNamesystem的功能

FSImage fsImage = new FSImage(conf, nameDirsToFormat, editDirsToFormat);
    try {
      FSNamesystem fsn = new FSNamesystem(conf, fsImage);
      fsImage.getEditLog().initJournalsForWrite();

      if (!fsImage.confirmFormat(force, isInteractive)) {
        return true; // aborted
      }

      fsImage.format(fsn, clusterId);
    } catch (IOException ioe) {
      LOG.warn("Encountered exception during format: ", ioe);
      fsImage.close();
      throw ioe;
    }

最后调用了FSImage#format方法进行格式化操作

void format(FSNamesystem fsn, String clusterId) throws IOException {
    long fileCount = fsn.getTotalFiles();
    // Expect 1 file, which is the root inode
    Preconditions.checkState(fileCount == 1,
        "FSImage.format should be called with an uninitialized namesystem, has " +
        fileCount + " files");
    NamespaceInfo ns = NNStorage.newNamespaceInfo();
    LOG.info("Allocated new BlockPoolId: " + ns.getBlockPoolID());
    ns.clusterID = clusterId;
    
    storage.format(ns);//进行namenode所有的目录的格式化,写属性文件
    editLog.formatNonFileJournals(ns);//初始化编辑日志
    saveFSImageInAllDirs(fsn, 0);//初始化fsimage
  }

namenode的启动

整体流程

namenode的启动是直接进入了了上述switch中的default选项,使用配置文件调用构造方法构造了namenode对象

在构造方法中,首先进行了一系列的赋值操作,然后调用initialize(Configuration conf)来初始化namenode

首先通过startHttpServer来启动一个web服务器,我们可以通过这个web服务器来查询hdfs的各种使用情况,其次用loadNamesystem(conf)从磁盘加载元数据到内存中,然后 rpcServer = createRpcServer(conf);来初始化namenode的rpc服务。最后startCommonServices(conf);来启动服务,这个时候namnode的各项服务就初始化完成了。

服务启动流程详解

通过FSNamesystem中的startCommonServices方法来启动服务 namesystem.startCommonServices(conf, haContext); 然后调用了org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.activate(Configuration)

public void activate(Configuration conf) {
    pendingReplications.start();
    datanodeManager.activate(conf);
    this.replicationThread.start();
    this.blockReportThread.start();
  }

pendingReplications

pendingReplications.start()构造了一个PendingReplicationMonitor线程并且启动, PendingReplicationMonitor的功能参考以下注释

/*
   * A periodic thread that scans for blocks that never finished
   * their replication request.
   */
  class PendingReplicationMonitor implements Runnable {
      .................
  }

datanodeManager

datanodeManager.activate(conf);启动了监控线程和心跳处理线程

void activate(final Configuration conf) {
    decomManager.activate(conf);
    heartbeatManager.activate(conf);
  }

replicationThread

初始化副本的监控线程ReplicationMonitor并启动

blockReportThread

初始化块处理线程,对datanode上报的数据块进行处理,此线程为后台线程 setDaemon(true);

分享到:
评论

相关推荐

    Hadoop源码分析 完整版 共55章

    ### Hadoop源码分析知识点概览 #### 一、Hadoop概述与背景 - **Google核心技术**:Hadoop的设计理念很大程度上受到了Google一系列核心技术的影响,包括Google File System (GFS)、BigTable以及MapReduce等。这些...

    hadoop源码分析-HDFS&MapReduce

    源码中,NameNode的启动和状态维护,以及DataNode与NameNode的交互机制是重点。 2. **Block Management**:HDFS将大文件切分成多个块,并将这些块复制到多个DataNode上以实现冗余。源码中,文件块的分配策略、副本...

    mac下hadoop3.1.4源码

    接下来,构建并编译Hadoop源码: ``` mvn clean package -Pdist,native -DskipTests ``` 这将生成编译后的二进制文件,位于`hadoop-dist/target/hadoop-3.1.4`目录下。 为了运行Hadoop,你需要创建一个简单的HDFS...

    Hadoop3.1.3源码编译

    通过编译Hadoop源码,开发者不仅可以学习到Hadoop的内部实现,还可以为社区贡献自己的改进和修复,推动开源项目的发展。 总的来说,编译Hadoop 3.1.3源码是一项涉及Java、Maven和Hadoop核心概念的复杂任务。这不仅...

    hadoop2.6.5源码zip

    通过深入学习和分析Hadoop 2.6.5源码,开发者不仅可以提升对分布式计算的理解,还能更好地利用Hadoop解决实际问题,进行定制化开发,或是优化现有系统。对于大数据领域的从业者来说,这是一份宝贵的资源。

    VirtualBox下安装hadoop

    1. 使用 `start-dfs.sh` 和 `start-yarn.sh` 命令启动 Hadoop 的 DataNode、NameNode、ResourceManager 和 NodeManager。 2. 访问 Hadoop Web 界面,NameNode 的默认端口是 50070,ResourceManager 的默认端口是 ...

    hadoop组件程序包.zip

    压缩包“soft”通常包含了Hadoop安装所需的全部组件和工具,包括Hadoop源码、编译好的二进制文件、配置文件模板以及实用工具,如Hadoop命令行工具、HDFS操作工具等。这些文件对于初学者来说,是实践和学习Hadoop的...

    Hadoop学习总结.doc

    HDFS(Hadoop Distributed File System)是Hadoop的核心组件之一,它主要用于存储大规模的数据集。HDFS默认的基本存储单位是64MB的数据块。与传统的文件系统不同,HDFS将文件分割成若干个块进行存储。尽管每个块的...

    hadoop1.0.2 hbase0.94安装

    1. **获取源码**:从Hadoop源码仓库获取包含插件的源代码。 2. **构建环境**:确保Eclipse和Maven已经安装,并配置好Maven的环境变量。 3. **导入项目**:在Eclipse中导入Hadoop源码工程。 4. **编译插件**:使用...

    hadoop 权威指南源码

    5. **源码学习方法**:阅读源码是一个深度学习的过程,需要具备一定的Java基础和分布式系统知识。首先,可以从整体结构入手,理解各个模块的功能和相互关系;然后,关注关键类和方法,如NameNode的启动流程、...

    Hadoop平台搭建方案_hadoop_源码.zip

    本压缩包文件“Hadoop平台搭建方案_hadoop_源码.zip”包含了搭建Hadoop环境所需的详细步骤和源代码,对于学习和实践Hadoop的初学者或开发者来说,是一份宝贵的资源。 首先,我们来探讨Hadoop的核心组件: 1. ...

    hadoop-2.4.1版本大数据

    5. **启动Hadoop**:依次启动DataNode、ResourceManager、NodeManager和NameNode。 6. **测试运行**:通过上传文件到HDFS并执行简单的MapReduce任务,验证Hadoop环境是否配置成功。 四、Hadoop大数据处理 1. **...

    Eclipse中编译运行Hadoop-0.20.1源码

    在Hadoop-0.20.1的根目录下,先执行`bin/hadoop dfs -format`命令对HDFS进行格式化,然后运行`bin/start-all.sh`启动所有Hadoop服务,包括NameNode、DataNode、TaskTracker和JobTracker。 最后,你可以尝试编译并...

    初识hadoop之hadoop 安装

    2. **获取Hadoop源码** Hadoop的源码可以在Apache官方网站上下载,通常以.tgz或.zip格式提供。你可以选择最新的稳定版本,或者根据项目需求选择特定版本。 3. **解压并配置Hadoop** - 使用`tar -zxvf hadoop-x.x....

    hadoop配置

    3. **启动服务**:按照启动顺序依次启动NameNode、Secondary NameNode、DataNode、ResourceManager和NodeManager。 4. **格式化NameNode**:首次部署时,需要对NameNode进行格式化以初始化HDFS。 四、Hadoop源码...

    Hadoop 2.7.4 Windows 7 64位 编译bin(包含winutils.exe, hadoop.dll等)

    然后可以启动Hadoop的DataNode和NameNode进程,开始使用Hadoop服务。 7. **测试运行**:运行简单的Hadoop MapReduce程序,如WordCount,验证Hadoop在Windows上的正确安装和配置。 这个压缩包中的"bin"目录可能包含...

    hadoop-src源代码

    五、Hadoop源码的学习价值 深入阅读Hadoop源码,有助于理解分布式系统的设计原理,包括一致性、容错性、扩展性和性能优化。此外,还能帮助开发者解决实际问题,例如调试错误、优化作业性能、设计新的分布式算法等。 ...

    hadooponwindows-master.rar

    - **获取Hadoop源码或二进制包**:可以从Apache官方网站下载Hadoop的tar.gz或zip文件。 - **解压并配置环境变量**:将Hadoop解压到适当目录,并在系统环境变量中添加HADOOP_HOME,以及更新PATH变量。 - **配置...

    hadoop-2.7.2---win10.zip

    6. **格式化NameNode**:在命令行中使用`hadoop namenode -format`命令对NameNode进行格式化,这是首次启动Hadoop集群的必要步骤。 7. **启动Hadoop服务**:通过运行`start-dfs.sh`和`start-yarn.sh`脚本启动Hadoop...

Global site tag (gtag.js) - Google Analytics