为了简化命令行方式运行作业,Hadoop自带了一些辅助类。GenericOptionsParser是一个类,用来解释常用的Hadoop命令行选项,并根据需要,为Configuration对象设置相应的取值。通常不直接使用GenericOptionsParser,更方便的方式是:实现Tool接口,通过ToolRunner来运行应用程序,ToolRunner内部调用GenericOptionsParser:
- GenericOptionsParser:
- public interface Tool extends Configurable {
- int run(String [] args) throws Exception;
- }
例5-3给出了一个非常简单的Tool的实现,用来打印Tool的Configuration对象中所有属性的键值对。
例5-3. Tool实现示例,用于打印一个Configuration对象的属性
- public class ConfigurationPrinter extends Configured implements Tool {
- static {
- Configuration.addDefaultResource("hdfs-default.xml");
- Configuration.addDefaultResource("hdfs-site.xml");
- Configuration.addDefaultResource("mapred-default.xml");
- Configuration.addDefaultResource("mapred-site.xml");
- }
- @Override
- public int run(String[] args) throws Exception {
- Configuration conf = getConf();
- for (Entry<String, String> entry: conf) {
- System.out.printf("%s=%s\n", entry.getKey(), entry.getValue());
- }
- return 0;
- }
- public static void main(String[] args) throws Exception {
- int exitCode = ToolRunner.run(new ConfigurationPrinter(), args);
- System.exit(exitCode);
- }
- }
我们把ConfigurationPrinter作为Configured的一个子类,Configured是Configurable接口的一个实现。Tool的所有实现都需要实现Configurable(因为Tool继承于Configurable),Configured子类通常是一种最简单的实现方式。run()方法通过Configurable的getConf()方法获取Configuration,然后重复执行,将每个属性打印到标准输出。
静态代码部分用来获取HDFS和MapReduce配置和核心配置(Configuration已经取得核心配置)。
ConfigurationPrinter的main()方法没有直接调用自身的run()方法,而是调用ToolRunner的静态run()方法,该方法负责在调用run()方法之前,为Tool建立一个Configuration对象。ToolRunner还使用了GenericOptionsParser来获取在命令行方式中指定的任何标准选项,然后,在Configuration实例上进行设置。运行下列代码,可以看到在conf/hadoop-localhost.xml中设置的属性。
- % hadoop ConfigurationPrinter -conf conf/hadoop-localhost.xml \
- | grep mapredmapred.job.tracker=
- mapred.job.tracker=localhost:8021
可以设置哪些属性?
可以在环境中设置什么属性,一个有用的工具便是ConfigurationPrinter。
也可以在Hadoop安装路径的docs目录中,查看所有公共属性的默认设置,相关文件包括coredefault.html,hdfs-default.html 和mapred-default.html这几个HTML文件。每个属性都有用来解释属性作用和取值范围的描述。
注意:在客户端配置中设置某些属性,将不会产生影响。例如,如果在作业提交时想通过设置mapred.tasktracker.map.tasks.maximum来改变运行作业的tasktracker的任务槽(task slot)数,结果会令你失望,因为这个属性只能在tasktracker的mapred-site.xml文件中进行设置。一般情况下,可以通过属性名来告诉组件该属性应该在哪里进行设置,由于mapred.tasktracker.map.tasks.maximum以mapred.tasktracker开头,因此,我们知道它只能为tasktracker守护进程设置。但是,这不是硬性的,在有些情况下,我们需要进行尝试,甚至去阅读源码。
本书讨论了Hadoop的很多重要的配置属性。在本书的网站(http://www.hadoopbook.com)上可以找到配置属性的参考资料。
GenericOptionsParser也允许设置个别属性。例如:
- % hadoop ConfigurationPrinter -D color=yellow | grep color
- color=yellow
-D选项用于将键color的配置属性值设置为yellow。设置为-D的选项优先级要高于配置文件里的其他属性。这一点很有用:可以把默认属性放入配置文件中,然后再在需要时,用-D选项来覆盖它们。一个常见的例子是:通过-D mapred.reduce.tasks=n来设置MapReduce作业中reducer的数量。这样会覆盖集群上或客户端配置属性文件中设置的reducer数量。
GenericOptionsParser和ToolRunner支持的其他选项见表5-1。更多的Hadoop配置API可以在第130页的"配置API"小节中找到。
用-D property=value选项将Hadoop属性设置为GenericOptionsParser (和 ToolRunner),不同于用-Dproperty=value选项将JVM系统属性设置为Java命令。JVM系统属性的语法不允许D和属性名之间有任何空格,而GenericOptionsParser要求用空格来分隔D和属性名。
JVM系统属性来自于java.lang.System类,而Hadoop属性只能从Configuration对象中获取。所以,下面的命令行将没有任何输出,因为ConfigurationPrinter没有使用System类
- % hadoop -Dcolor=yellow ConfigurationPrinter | grep color
如果希望通过系统属性进行配置,则需要在配置文件中反映相关的系统属性。具体讨论见第132页的"可变的扩展"小节。
表5-1. GenericOptionsParser选项和ToolRunner 选项
选项名称 | 描述 |
-D property=value | 将指定值赋值给确定的Hadoop配置属性。 覆盖配置文件里的默认属性或站点属性, 或通过-conf选项设置的任何属性 |
-conf filename ... | 将指定文件添加到配置的资源列表中。 这是设置站点属性或同时设置一组属性的简便方法 |
-fs uri | 用指定的URI设置默认文件系统。这是 -D fs.default.name=uri的快捷方式 |
-jt host:port | 用指定主机和端口设置jobtracker。这是- D mapred.job.tracker= host:port的快捷方式 |
-files file1,file2,... | 从本地文件系统(或任何指定模式的文件系统) 中复制指定文件到jobtracker所用的共享文件 系统(通常是HDFS),确保在任务工作目录的 MapReduce程序可以访问这些文件(要想进一步 了解如何复制文件到tasktracker机器的分布式缓 存机制,请参见第253页的“分布式缓存”小节) |
-archives | 从本地文件系统(或任何指定模式的文件系统) 复制指定存档到jobtracker所用的共享文件系统 (通常是HDFS),打开存档文件,确保任务工作 目录的MapReduce程序可以访问这些存档 |
选项名称 | 描述 |
-libjars jar1,jar2,… | 从本地文件系统(或任何指定模式的文件系统)复制指 定JAR文件到被jobtracker 使用的共享文件系统 (通常是HDFS),把它们加入MapReduce任务的类路 径中。这个选项适用于传输作业需要的JAR文件 |