源码:2.8.0
入口类:org.apache.hadoop.hdfs.server.namenode.NameNode
main方法会调用createNameNode 创建 NameNode 实例,如果是 FORMAT 戒 FINALIZE,调用对应的方法后退出,如果是其他的参数,将创建NameNode 对象。创建的服务如下:
服务 类
server ipc.RPC.Server server.namenode.NameNodeRpcServer
serviceRpcServer ipc.RPC.Server
HttpServer http.HttpServer
Trash Emptier fs.Trash.Trash.Emptier
hbthread hdfs.server.namenode.FSNamesystem.HeartbeatMonitor
lmthread hdfs.server.namenode.LeaseManager.Monitor
replthread hdfs.server.namenode.FSNamesystem.ReplicationMonitor
dnthread hdfs.server.namenode.DecommissionManager.Monitor
初始化步骤如下:
分析启动模式: Format(格式化NameNode元数据及日志信息)
// Parse the rest, NN specific args.
StartupOption startOpt = parseArguments(argv);
if (startOpt == null) {
printUsage(System.err);
return null;
}
setStartupOption(conf, startOpt);
准备工作:
setClientNamenodeAddress(conf); //设置clients访问nomenode或nameservice的访问地址 配置项fs.defaultFS
1.初始化登录认证,如果HADOOP开启了Kerberos认证,则进行认证。
UserGroupInformation.setConfiguration(conf);
loginAsNameNodeUser(conf);
认证的配置信息来自hdfs-site.xml
配置项
Dfs.namenode.keytab.file #keytab文件
Dfs.namenode.kerberos.principal #kerberos认证个体
最后调用接口进行认证
//UserGroupInformation管理用户登录
UserGroupInformation.loginUserFromKeytab(principalName, keytabFilename);
2.如果当前启动的NameNode角色是启用状态,启动HTTPServer服务
if (NamenodeRole.NAMENODE == role) {
startHttpServer(conf);
}
3.创建RPCServer
rpcServer = createRpcServer(conf);
创建过程如下:
#初始化NameNode线程数,dfs.namenode.handler.count 默认10
int handlerCount =
conf.getInt(DFS_NAMENODE_HANDLER_COUNT_KEY,
DFS_NAMENODE_HANDLER_COUNT_DEFAULT); #设置初始化的RPC Engine
RPC.setProtocolEngine(conf, ClientNamenodeProtocolPB.class,
ProtobufRpcEngine.class);
NameNodeRpcServer实现NamenodeProtocols 支持以下Rpc调用
public interface NamenodeProtocols
extends ClientProtocol,
DatanodeProtocol,
DatanodeLifelineProtocol,
NamenodeProtocol,
RefreshAuthorizationPolicyProtocol,
RefreshUserMappingsProtocol,
RefreshCallQueueProtocol,
GenericRefreshProtocol,
GetUserMappingsProtocol,
HAServiceProtocol,
TraceAdminProtocol {
}
NameNodeRpcServer
/** The RPC server that listens to requests from DataNodes
##Address配置:dfs.namenode.servicerpc-address 默认8022
##dfs.namenode.service.handler.count 处理线程数
*/
private final RPC.Server serviceRpcServer;
private final InetSocketAddress serviceRPCAddress; /** The RPC server that listens to lifeline requests
#dfs.namenode.lifeline.rpc-address 默认50070*/
private final RPC.Server lifelineRpcServer;
private final InetSocketAddress lifelineRPCAddress; /** The RPC server that listens to requests from clients
dfs.namenode.rpc-bind-host 默认8020*/
protected final RPC.Server clientRpcServer;
protected final InetSocketAddress clientRpcAddress;