hadoop-2.6.4 NameNode 源码分析学习

Namenode的介绍

一个简单的hadoop集群是由一个ACtive的namenode和多个datenode组成的,

namdnode是这个文件系统的管理节点。它维护着整个文件系统的目录树,文件/目标的元信息和每个文件对应的数据块列表。接受用户的操作请求。

 

启动Namenode

调用脚本:bin/hdfs namde

hdfs的启动脚本:

...

COMMAND=$1
...

if [ "$COMMAND" = "namenode" ] ; then
  CLASS='org.apache.hadoop.hdfs.server.namenode.NameNode'
  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_NAMENODE_OPTS"

...
# run it
  exec "$JAVA" -Dproc_$COMMAND $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "$@"

####最终namenode是启动org.apache.hadoop.hdfs.server.namenode.NameNode这个类

 

由shell脚本可以知道namenode的实现类是org.apache.hadoop.hdfs.server.namenode.NameNode;

Namenode代码解释:

 

public class NameNode implements NameNodeStatusMXBean {
//namenode程序入口
public static void main(String argv[]) throws Exception {
    if (DFSUtil.parseHelpArgument(argv, NameNode.USAGE, System.out, true)) {
      System.exit(0);
    }

    try {
      StringUtils.startupShutdownMessage(NameNode.class, argv, LOG);
      //创建namenode实例
      NameNode namenode = createNameNode(argv, null);
      if (namenode != null) {
        namenode.join();
      }
    } catch (Throwable e) {
      LOG.fatal("Failed to start namenode.", e);
      terminate(1, e);
    }
  }

  public static NameNode createNameNode(String argv[], Configuration conf)
      throws IOException {
    ...
    //获取操作参数
    StartupOption startOpt = parseArguments(argv);
  

    switch (startOpt) {
      case FORMAT: {//初次启动hadoop集群,要格式化namenode
        boolean aborted = format(conf, startOpt.getForceFormat(),
            startOpt.getInteractiveFormat());
        terminate(aborted ? 1 : 0);
        return null; // avoid javac warning
      }
      ......
      default: {//正常启动namenode
        DefaultMetricsSystem.initialize("NameNode");
        return new NameNode(conf);
      }
    }
  }  

   //操作hdfs文件系统的类
  public FSNamesystem namesystem;
   
   /** httpServer,平时我们在浏览器查看的hdfs的web管理控制台,就是通过它显示的,它包装了一个内嵌的jetty */
  protected NameNodeHttpServer httpServer;

  /** RPC服务器,DFSClient,DataNode和Namenode通信都要通过它 */
  private NameNodeRpcServer rpcServer;

  protected NameNode(Configuration conf, NamenodeRole role) 
      throws IOException { 
     ...  
      //执行initialize方法初始化
      initialize(conf);
      ...
    this.started.set(true);
  }

  protected void initialize(Configuration conf) throws IOException {
    ...
    //启动http服务器,启动后可以通过http://namenode:50070 访问hdfs的管理页面
    if (NamenodeRole.NAMENODE == role) {
      startHttpServer(conf);
    }
    ....
    //从fsimage和edits log加载元数据
    loadNamesystem(conf);
   //启动RPC server
    rpcServer = createRpcServer(conf);
    ....
   
  }

} 

 

我特别关注的是namenode两个部分的实现:与client,datanode的rpc通信,和文件管理的实现FSNamesystem

namenode启动rpc服务:

//这个类是用于RPC服务的响应
class NameNodeRpcServer implements NamenodeProtocols {
  
  //监听datanode请求的rpc服务  
  private final RPC.Server serviceRpcServer;

  //监听client请求的rpc服务 
  protected final RPC.Server clientRpcServer;

  public NameNodeRpcServer(Configuration conf, NameNode nn)
      throws IOException {
      ...
      //在服务端创建了一堆的rpc协议的实现类
       ClientNamenodeProtocolServerSideTranslatorPB 
       clientProtocolServerTranslator = 
         new ClientNamenodeProtocolServerSideTranslatorPB(this);
       BlockingService clientNNPbService = ClientNamenodeProtocol.
         newReflectiveBlockingService(clientProtocolServerTranslator);
      ...
      //创建RPC服务端,监听datanode的请求
      this.serviceRpcServer = new RPC.Builder(conf)
          .setProtocol(
              org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolPB.class)
          .setInstance(clientNNPbService)
          .setBindAddress(bindHost)
          .setPort(serviceRpcAddr.getPort()).setNumHandlers(serviceHandlerCount)
          .setVerbose(false)
          .setSecretManager(namesystem.getDelegationTokenSecretManager())
          .build();

     //想datanode监听rpc服务器进行协议的添加
    DFSUtil.addPBProtocol(conf, HAServiceProtocolPB.class, haPbService,
          serviceRpcServer);
     ..... 
  }
}

 

FSNamesystem是文件系统命名空间系统类,实现了namenode的基本服务功能,

FSNamesystem类就是实现去与datanode进行交互操作的类:

 

posted @ 2016-09-21 21:16  feihao_itboy  阅读(1012)  评论(0)    收藏  举报