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进行交互操作的类:

浙公网安备 33010602011771号