haishi 发表于 2017-3-2 11:30:10

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进行交互操作的类:
页: [1]
查看完整版本: hadoop-2.6.4 NameNode 源码分析学习