原创,转载请注明出处 白硕 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是Apache Hadoop的一个重大升级版本,它引入了YARN(Yet Another Resource Negotiator)作为其核心组件之一,以解决Hadoop 1.x版本中MapReduce框架存在的诸多限制,如扩展性差、资源利用率低以及对多种...
hadoop 2.0 详细安装手册。hadoop 2.0 详细安装手册。
生产环境的搭建则涉及到多个节点的多机配置,这需要对Hadoop集群进行更为复杂和细致的配置。 六、总结 安装部署Hadoop 2.0涉及多个步骤,需要仔细规划和配置。无论是测试环境还是生产环境的搭建,都需要合理的硬件...
【Hadoop 2.0 部署详解】 在大数据处理领域,Apache Hadoop 是一个不可或缺的开源框架,尤其在大规模数据存储和处理方面表现出强大的能力。Hadoop 2.0 引入了高可用性(HA)特性,极大地提高了系统的稳定性。本文将...
本文是详细的Hadoop2.0安装方法步骤
hadoop2.0版本安装手册,包含hadoop、hive、hbase、mahout、sqoop、spark、storm、整个体系的安装配置
【实战Hadoop 2.0】是一套深入学习Hadoop生态系统的PPT文档,涵盖了Hadoop分布式文件系统(HDFS)、资源调度器YARN、数据分析工具Spark、Ambari管理平台等多个关键组件。以下是这些核心知识点的详细解析: 1. **...
### Hadoop 2.0:从YARN到下一代大数据处理平台 #### 1. Hadoop 2.0:新时代的大数据处理平台 Hadoop 2.0是Apache Hadoop的一个重要版本,它标志着Hadoop从单一的MapReduce计算框架转变为一个更加通用、可扩展和...
在大数据领域,Hadoop 2.0 是一个关键的分布式计算框架,它为海量数据处理提供了强大支持。本文将深入探讨Hadoop 2.0的主要组件、架构、以及其相较于Hadoop 1.0的改进。 一、Hadoop 2.0概述 Hadoop 2.0是Apache软件...
6.1 Hadoop 2.0 大家族概述 Hadoop 2.0 是一个开源的分布式计算框架,是Hadoop生态系统的核心组成部分,它在Hadoop 1.0的基础上进行了重大改进,引入了YARN(Yet Another Resource Negotiator),使得系统更加灵活和...
Hadoop 2.0是Apache Hadoop项目的一个重要版本,它带来了许多改进和优化,显著提高了大数据处理的性能和可扩展性。这个压缩包“Hadoop 2.0部署配置文件示例.zip”包含了用于配置和部署Hadoop集群的关键文件。下面...
Hadoop2.0中,MapReduce被重构为两个独立的组件:ResourceManager(RM)负责资源调度,TaskTracker被拆分为ApplicationMaster(AM)和NodeManager(NM)。这种分离使得资源管理更加高效,同时也支持了更多种类的计算...
实战Hadoop 2.0:从云计算到大数据(第二版)
- **5.5.3 命令行接口**:详细说明HDFS、YARN和Hadoop shell命令的使用,以及如何通过命令行进行文件操作、任务管理和集群管理。 6. **5.6 Hadoop 2.0 编程接口**: - **5.6.1 HDFS 编程**:教授如何使用Java API...
在搭建Hadoop2.0 HA环境之前,需要对虚拟机进行相应的配置: - **安装JDK 1.8**:Hadoop2.0需要Java 1.8环境支持。 - **创建用户**:推荐使用非root用户(例如work用户)进行安装和管理,避免权限问题。 - **SSH...
《云计算(第三版)》配套课程的PPT涵盖了云计算的多个关键领域,特别是对Hadoop 2.0这一主流开源云架构的深入讲解。Hadoop 2.0是大数据处理的关键技术之一,它在分布式计算中扮演着核心角色。本课程内容丰富,适合...
《云计算(第三版)》是由刘鹏教授主编的教材,配套的PPT课件涵盖了从大数据与云计算的基础概念,到主流的云服务提供商如Google、Amazon、微软的云计算平台介绍,再到开源云架构Hadoop 2.0的深入探讨。本部分主要...
1. Hadoop2.0安全机制:Hadoop2.0版本对安全性进行了增强,增加了对集群内部通信的加密和认证,以防止未授权访问。Hadoop采用Kerberos提供服务间的安全认证,确保集群内部的NameNode、DataNode等组件之间的数据传输...
大数据处理--hadoop2.0核心架构技术,主要介绍了大数据面临的挑战,而hadoop正是解决这些挑战的重要技术,接着分别介绍了hadoop1.0和hadoop2.0的区别,进而重点讲到hadoop2.0 YARN,详细分析MapReduce及HDFS架构。