原创,转载请注明出处 白硕 baishuo491@163.com
http://baishuo491.iteye.com/blog/1916241
2.0以后,重构为为以Command为基础的一系列类 bstract public class Command extends Configured
最核心的是run函数,里面主要的行为就是处理各种选项,展开参数,并且处理每个参数(注释原话 The default behavior is to process options, * expand arguments, and then process each argument.)
run函数里最核心的代码:
LinkedList<String> args = new LinkedList<String>(Arrays.asList(argv));
processOptions(args);
processRawArguments(args);
后面两个都是虚函数,要由子类来实现,因为不同的子类,处理的方法不一样。这个方法的注释上,给了调用过程,还是很复杂的:
<pre>
* run
* |-> {@link #processOptions(LinkedList)}
* \-> {@link #processRawArguments(LinkedList)}
* |-> {@link #expandArguments(LinkedList)} //这个和下面这个是在Command类里面实现的
* | \-> {@link #expandArgument(String)}*
* \-> {@link #processArguments(LinkedList)}
* |-> {@link #processArgument(PathData)}*
* | |-> {@link #processPathArgument(PathData)}
* | \-> {@link #processPaths(PathData, PathData...)}
* | \-> {@link #processPath(PathData)}*
* \-> {@link #processNonexistentPath(PathData)}
* </pre>
看看Command 的一个子类FsCommand , abstract public class FsCommand extends Command
里面有一个静态函数,
public static void registerCommands(CommandFactory factory) {
factory.registerCommands(CopyCommands.class);
factory.registerCommands(Count.class);
factory.registerCommands(Delete.class);
factory.registerCommands(Display.class);
。。。。。。。
如果要新建command,要这里面注册,这样就可以作为静态数据装载到内存里
public class CommandFactory extends Configured implements Configurable
里面有一个classMap 和 一个objectMap
private Map<String, Class<? extends Command>> classMap =
new HashMap<String, Class<? extends Command>>();
private Map<String, Command> objectMap =
new HashMap<String, Command>();
下面看看 CommandFactory 的函数 registerCommands
public void registerCommands(Class<?> registrarClass) {
try {
registrarClass.getMethod(
"registerCommands", CommandFactory.class
).invoke(null, this);
} catch (Exception e) {
throw new RuntimeException(StringUtils.stringifyException(e));
}
}
是registrarClass 调用自己的registerCommands命令
看一看CopyCommands 的registerCommands 命令,
public static void registerCommands(CommandFactory factory) {
factory.addClass(Merge.class, "-getmerge");
factory.addClass(Cp.class, "-cp");
factory.addClass(CopyFromLocal.class, "-copyFromLocal");
factory.addClass(CopyToLocal.class, "-copyToLocal");
factory.addClass(Get.class, "-get");
factory.addClass(Put.class, "-put");
}
原来CopyCommands 还有自己一系列的内部子类,都是静态的,在这里统一注册,如果要新建CopyCommands子类,就要在这里注册
CommandFactory 的addClass函数,可见是put到classMap里面了,名字和类调换了一下位置,字符串做主键
public void addClass(Class<? extends Command> cmdClass, String ... names) {
for (String name : names) classMap.put(name, cmdClass);
}
另外一个map objectMap,只有在FsShell的init函数里,被插入了Help() 和Usage() 两个对象
protected void init() throws IOException {
getConf().setQuietMode(true);
if (commandFactory == null) {
commandFactory = new CommandFactory(getConf());//创建一个单例的factory
commandFactory.addObject(new Help(), "-help");
commandFactory.addObject(new Usage(), "-usage");
registerCommands(commandFactory);//调用自己的registerCommands,其实是调用FsCommand的registerCommands,之前有提过。为了和DFSAdmin区分开
}
}
具体到每个命令的调用,因为都是从fshell 启动的,调用链如下:
FsShell.init() line: 83
FsShell.run(String[]) line: 241
ToolRunner.run(Configuration, Tool, String[]) line: 70
ToolRunner.run(Tool, String[]) line: 84
FsShell.main(String[]) line: 304
init之后,通过instance = commandFactory.getInstance(cmd);的到Class,cmd是解析出来的如-cat等字符串,去classMap里就可以get到对应的Class
之后,调用instance.run 执行我们最初讨论的 Command.run
分享到:
相关推荐
涉及到了Hadoop2.0、Hbase、Sqoop、Flume、Hive、Zookeeper的具体环境搭建
hadoop 2.0 详细安装手册。hadoop 2.0 详细安装手册。
Hadoop 2.0基本架构和发展趋势
第5章 Hadoop 2.0 主流开源云架构(一) 第5章 Hadoop 2.0 主流开源云架构(二) 第5章 Hadoop 2.0 主流开源云架构(三) 第5章 Hadoop 2.0 主流开源云架构(四) 第5章 Hadoop 2.0 主流开源云架构(五) 第6章 ...
实战Hadoop2.0 PPT文档,没有经过修饰的原文档,大家分享学习
Hadoop 2.0安装部署方法,手把手教,如何在linux上安装hadoop
本文是详细的Hadoop2.0安装方法步骤
hadoop2.0版本安装手册,包含hadoop、hive、hbase、mahout、sqoop、spark、storm、整个体系的安装配置
hadoop 2.0 文档资料。
实战Hadoop 2.0:从云计算到大数据(第二版)
为hadoop的学习搭建环境,研究hadoop处理和存储的机制。
大数据处理--hadoop2.0核心架构技术,主要介绍了大数据面临的挑战,而hadoop正是解决这些挑战的重要技术,接着分别介绍了hadoop1.0和hadoop2.0的区别,进而重点讲到hadoop2.0 YARN,详细分析MapReduce及HDFS架构。
第5章 Hadoop 2.0 主流开源云架构(一) 第5章 Hadoop 2.0 主流开源云架构(二) 第5章 Hadoop 2.0 主流开源云架构(三) 第5章 Hadoop 2.0 主流开源云架构(四) 第5章 Hadoop 2.0 主流开源云架构(五) 第6章 ...
开源思想,少要积分,仅供学习参考。 Hadoop2.0 从0到HA安装运行步骤。 开源思想,少要积分,仅供学习参考。 Hadoop2.0 从0到HA安装运行步骤。
第 4 章 安装部署 Hive 444.1 解压并安装 Hive 44
CentOS6.0-Hadoop安装手册,详细介绍centos下hadoop的搭建过程
第5章 Hadoop 2.0 主流开源云架构(一) 第5章 Hadoop 2.0 主流开源云架构(二) 第5章 Hadoop 2.0 主流开源云架构(三) 第5章 Hadoop 2.0 主流开源云架构(四) 第5章 Hadoop 2.0 主流开源云架构(五) 第6章 ...
第5章 Hadoop 2.0 主流开源云架构(一) 第5章 Hadoop 2.0 主流开源云架构(二) 第5章 Hadoop 2.0 主流开源云架构(三) 第5章 Hadoop 2.0 主流开源云架构(四) 第5章 Hadoop 2.0 主流开源云架构(五) 第6章 ...
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据...
Hadoop2.0安装部署、MapReduce编程实践: 1.Hadoop 2.0体系介绍 2.Hadoop 2.0安装部署方法 3.MapReduce编程实践 4.MapReduce和关系型数据库计算速度比较