基于 Apache Commons CLI 的命令行设计
通常情况下命令行处理有三个步骤:定义,解析和询问阶段
一、定义
package org.apache.hadoop.util;--GenericOptionsParser中
private static Options buildGeneralOptions(Options opts) { Option fs = OptionBuilder.withArgName("local|namenode:port") .hasArg() .withDescription("specify a namenode") .create("fs"); Option jt = OptionBuilder.withArgName("local|jobtracker:port") .hasArg() .withDescription("specify a job tracker") .create("jt"); Option oconf = OptionBuilder.withArgName("configuration file") .hasArg() .withDescription("specify an application configuration file") .create("conf"); Option property = OptionBuilder.withArgName("property=value") .hasArg() .withDescription("use value for given property") .create('D'); Option libjars = OptionBuilder.withArgName("paths") .hasArg() .withDescription("comma separated jar files to include in the classpath.") .create("libjars"); Option files = OptionBuilder.withArgName("paths") .hasArg() .withDescription("comma separated files to be copied to the " + "map reduce cluster") .create("files"); Option archives = OptionBuilder.withArgName("paths") .hasArg() .withDescription("comma separated archives to be unarchived" + " on the compute machines.") .create("archives"); // file with security tokens Option tokensFile = OptionBuilder.withArgName("tokensFile") .hasArg() .withDescription("name of the file with the tokens") .create("tokenCacheFile"); opts.addOption(fs); opts.addOption(jt); opts.addOption(oconf); opts.addOption(property); opts.addOption(libjars); opts.addOption(files); opts.addOption(archives); opts.addOption(tokensFile); return opts; }
二、解析
/** * Parse the user-specified options, get the generic options, and modify * configuration accordingly * @param conf Configuration to be modified * @param args User-specified arguments * @return Command-specific arguments */ private String[] parseGeneralOptions(Options opts, Configuration conf, String[] args) throws IOException { opts = buildGeneralOptions(opts); /** * Apache CLI支持多种输入参数格式,主要支持的格式有以下几种 * POSIX(Portable Operating System Interface of Unix)中的参数形式,例如 tar -zxvf foo.tar.gz GNU 中的长参数形式,例如 du --human-readable --max-depth=1 Java 命令中的参数形式,例如 java -Djava.net.useSystemProxies=true Foo 短杠参数带参数值的参数形式,例如 gcc -O2 foo.c 长杠参数不带参数值的形式,例如 ant – projecthelp */ //使用GNU解析 CommandLineParser parser = new GnuParser(); try { commandLine = parser.parse(opts, args, true); processGeneralOptions(conf, commandLine); return commandLine.getArgs(); } catch(ParseException e) { LOG.warn("options parsing failed: "+e.getMessage()); HelpFormatter formatter = new HelpFormatter(); formatter.printHelp("general options are: ", opts); } return args; }
三、询问
/** * Modify configuration according user-specified generic options * @param conf Configuration to be modified * @param line User-specified generic options */ private void processGeneralOptions(Configuration conf, CommandLine line) throws IOException { if (line.hasOption("fs")) { FileSystem.setDefaultUri(conf, line.getOptionValue("fs")); } if (line.hasOption("jt")) { conf.set("mapred.job.tracker", line.getOptionValue("jt")); } if (line.hasOption("conf")) { String[] values = line.getOptionValues("conf"); for(String value : values) { conf.addResource(new Path(value)); } } if (line.hasOption("libjars")) { conf.set("tmpjars", validateFiles(line.getOptionValue("libjars"), conf)); //setting libjars in client classpath URL[] libjars = getLibJars(conf); if(libjars!=null && libjars.length>0) { conf.setClassLoader(new URLClassLoader(libjars, conf.getClassLoader())); Thread.currentThread().setContextClassLoader( new URLClassLoader(libjars, Thread.currentThread().getContextClassLoader())); } } if (line.hasOption("files")) { conf.set("tmpfiles", validateFiles(line.getOptionValue("files"), conf)); } if (line.hasOption("archives")) { conf.set("tmparchives", validateFiles(line.getOptionValue("archives"), conf)); } if (line.hasOption('D')) { String[] property = line.getOptionValues('D'); for(String prop : property) { String[] keyval = prop.split("=", 2); if (keyval.length == 2) { conf.set(keyval[0], keyval[1]); } } } conf.setBoolean("mapred.used.genericoptionsparser", true); // tokensFile if(line.hasOption("tokenCacheFile")) { String fileName = line.getOptionValue("tokenCacheFile"); // check if the local file exists try { FileSystem localFs = FileSystem.getLocal(conf); Path p = new Path(fileName); if (!localFs.exists(p)) { throw new FileNotFoundException("File "+fileName+" does not exist."); } LOG.debug("setting conf tokensFile: " + fileName); conf.set("mapreduce.job.credentials.json", localFs.makeQualified(p).toString()); } catch (IOException e) { throw new RuntimeException(e); } } }
解析完成之后再执行,执行代码如下,在ToolRunner中
public static int run(Configuration conf, Tool tool, String[] args) throws Exception{ if(conf == null) { conf = new Configuration(); } GenericOptionsParser parser = new GenericOptionsParser(conf, args); //set the configuration back, so that Tool can configure itself tool.setConf(conf); //get the args w/o generic hadoop args String[] toolArgs = parser.getRemainingArgs(); return tool.run(toolArgs); }
相关推荐
- **验证 Hive 的两种方式**:通过 Hive CLI 和其他工具验证 Hive 是否正常工作。 - **Solr 安装** - **Solr 简介**:了解 Solr 的基本概念和作用。 - **Solr 安装**:安装 Solr。 - **部署 Solr**:配置 Solr。...
在Hadoop中,它用于解析MapReduce作业的命令行参数,帮助用户指定输入、输出路径等。 2. **hadoop-common-2.6.0.jar**:这个文件包含了Hadoop的通用功能,如文件系统抽象、网络通信、配置管理、日志记录等。它是...
Apache Commons CLI库是Java开发中的一个实用工具,用于处理命令行接口(CLI)的解析和管理。这个库在处理命令行参数和选项时提供了一种简单而强大的方式,使得开发者可以更加灵活地构建命令行驱动的程序。"commons-...
- 操作界面:用户可以通过命令行接口(CLI)、Web 界面或 Thrift API 进行交互。 - Driver:负责解析用户输入的 HiveQL 语句,并将其转化为 MapReduce 作业。 - Hadoop:Hive 使用 HDFS 存储数据,并依赖 MapReduce ...
- `$HADOOP_HOME/share/hadoop/common/lib/commons-cli-1.2.jar` 此外,我们还可以通过运行`hadoop classpath`命令来获取运行Hadoop程序所需的完整classpath信息,这对于理解整个系统所依赖的所有JAR文件非常有帮助...
### 高级软件人才培训专家-Hadoop课程资料-4-第四章 - 分布式SQL计算 Hive 入门 #### Apache Hive 概述 Apache Hive 是一款面向大数据处理的分布式 SQL 计算工具,旨在简化 Hadoop 生态系统中的数据查询与分析流程...
当用户执行 HiveQL 查询时,Hive 驱动会解析查询,生成相应的 MapReduce 作业,并提交到 Hadoop 集群执行。执行完成后,结果会被写回到 HDFS 或其他数据存储。 总的来说,Hive 作为一个数据仓库工具,简化了在 ...
### Hadoop实战手册知识点解析 #### 一、文档概述与背景 - **文档目标**:本文档旨在提供一套详尽的Hadoop安装部署指南,帮助读者实现从零开始的Hadoop集群部署。它覆盖了Hadoop单机安装及集群安装的具体步骤,并...
#### 详细知识点解析: ##### 一、前言 在Mac环境下搭建Hadoop和Hive对于数据分析、大数据处理的学习者来说至关重要。通过本指南,我们将逐步了解如何在Mac上安装并配置Hadoop和Hive环境,以便能够进行数据处理和...
- Driver组件负责HiveQL语句的解析、编译优化及执行计划生成,并调用MapReduce计算框架。 - Metastore组件存储Hive元数据,支持关系数据库如derby和mysql,并可将服务独立到远程服务器集群中。 - Thrift服务允许...
- **CLI操作**: 提供了一系列命令行工具,允许用户进行文件上传、下载、删除等操作。 **3.4 Hadoop文件系统** - **文件系统层次结构**: HDFS支持层次化的文件系统结构,用户可以像使用传统文件系统那样来管理文件...
### Hadoop实战培训教程(部署篇)_V3.pdf 知识点解析 #### 概述 本教程旨在提供一套全面的手动部署Hadoop及其生态系统的指南,特别针对GBase技术人员。通过本教程,读者可以了解如何从零开始搭建一个包含Hadoop、...
- CLI (命令行界面): 用户可以通过命令行来执行 HiveQL 查询。 - Client: 这是指客户端程序,可以是 Java API 或其他编程语言接口。 - WUI (Web 用户界面): 用于通过 Web 浏览器访问 Hive。 2. **元数据存储**: ...
1. **Hive Metastore**: 这是Hive的核心组件,存储元数据,如表名、列名、分区信息等,这些信息用于解析HQL查询。在CDH中,通常会配置Hive与MySQL 5.6集成,作为元数据的持久化存储。 2. **Hive CLI (Command Line ...
《Hive:基于Hadoop的数据仓库深度解析》 Hive,作为大数据处理的重要工具,是建立在Hadoop文件系统上的数据仓库架构,旨在为大规模数据集提供数据分析和管理能力。其设计初衷是解决直接使用Hadoop MapReduce进行...
1. **Hive CLI(Command Line Interface)**:这是用户与 Hive 交互的主要接口,提供了命令行工具用于执行 SQL 查询。 2. **Metastore**:存储元数据,如表的定义、分区信息等。元数据通常存储在关系数据库中,如 ...
Hive支持多种访问接口,如BeeLine、Hive CLI、JDBC、ODBC和Web接口,适应不同用户需求。 6.6 Oozie Oozie 是一个工作流调度系统,用来管理和协调Hadoop生态系统中的工作流任务,如MapReduce作业、Pig脚本、Hive查询...
5. **元数据管理**: Hive维护了关于数据的元数据,如表名、列名、分区等,这些信息用于解析和执行查询。 在压缩包子文件的文件名称列表中,我们看到"**fjw_hadoop-3.2.3.tar.gz**"。这表明压缩包中还包含了Hadoop的...