最近突然想看下hadoop源码,有利于处理一些突发问题。先从name启动开始,
NameNode.java
public static void main(String argv[]) throws Exception { try { StringUtils.startupShutdownMessage(NameNode.class, argv, LOG); #这个应该是打印日志 NameNode namenode = createNameNode(argv, null); #实例化一个namenode if (namenode != null) namenode.join(); } catch (Throwable e) { LOG.error(StringUtils.stringifyException(e)); System.exit(-1); } }
createNameNode 首先判断配置文件
if (conf == null) conf = new Configuration(); StartupOption startOpt = parseArguments(argv); #配置,如果传入参数为空直接诶new conf应该是使用默认配置,如果有传入参数就将参数传给parseArguments()方法
if (startOpt == null) { #启动参数,如果没传入,将打印参数使用帮助吧,
printUsage();
return null;
}
switch (startOpt) { #这里主要分两种情况,一中是格式化namenode,一种是FINALIZE namenode case FORMAT:FORMAT boolean aborted = format(conf, true); System.exit(aborted ? 1 : 0); case FINALIZE: aborted = finalize(conf, true); System.exit(aborted ? 1 : 0); default: }
private static StartupOption parseArguments(String args[]) { int argsLen = (args == null) ? 0 : args.length; StartupOption startOpt = StartupOption.REGULAR; for(int i=0; i < argsLen; i++) { String cmd = args[i]; if (StartupOption.FORMAT.getName().equalsIgnoreCase(cmd)) { startOpt = StartupOption.FORMAT; } else if (StartupOption.REGULAR.getName().equalsIgnoreCase(cmd)) { startOpt = StartupOption.REGULAR; } else if (StartupOption.UPGRADE.getName().equalsIgnoreCase(cmd)) { startOpt = StartupOption.UPGRADE; } else if (StartupOption.ROLLBACK.getName().equalsIgnoreCase(cmd)) { startOpt = StartupOption.ROLLBACK; } else if (StartupOption.FINALIZE.getName().equalsIgnoreCase(cmd)) { startOpt = StartupOption.FINALIZE; } else if (StartupOption.IMPORT.getName().equalsIgnoreCase(cmd)) { startOpt = StartupOption.IMPORT; } else return null; } return startOpt; }