配置开发环境
首先下载你准备使用的Hadoop版本,然后在开发机器上解压缩。然后,在你自己喜欢的IDE中,新建一个项目,把打开的下载文件包中顶级目录和lib目录中的所有JAR文件添加到类路径中(classpath)。然后,便可以编译 Java Hadoop程序,并在IDE中以独立(standalone)模式运行它们。
Eclipse用户可以安装一个插件来浏览HDFS和启动MapReduce程序。
另外,Karmasphere提供了 Eclipse和NetBeans插件,可用于开发和 运行MapReduce作业,浏览Hadoop集群。
配置管理
开发Hadoop应用时,经常需要在本地运行和集群运行之间进行切换。事实上,可 能在几个集群上工作,或可以在本地“伪分布式”集群上测试。伪分布式集群是其 守护进程运行在本机的集群。
应对这些变化的一种方法是使Hadoop配置文件包含每个集群的连接设置,并且指 定在运行Hadoop应用或工具时使用哪一个连接设置。最好的做法是,把这些文件 放在Hadoop安装目录树之外,以便于轻松地在Hadoop不同版本之间进行切换, 从而避免重复或丢失设置信息。
考虑到本书的宗旨,我们假设目录conf包含3个配置文件:hadoop-local.xml, hadoop-localhost.xml和hadoop-cluster.xml(这些文件在本书的示例代码里)。注 意,文件名没有特殊要求,只是为了方便打包配置的设置。
hadoop-local.xml文件中包含Hadoop默认文件系统和jobtracker的默认配置信息:
<?xml version="1.0"? > <configuration > <property > <name >fs.default.name</name > <value >file:///</value > </property > <property > <name >mapned.job.tracken</name > <value >local</value > </property > </configuration >
hadoop-localhost.xml文件中的设置指向本地主机上运行的namenode和jobtracker:
<?xml version="1.0"?> <configuration> <property> <name>fs.default.name</name> <value>hdfs://localhost/</value> </property> <property> <name>mapned.job.tnacken</name> <value>localhost:8021</value> </property> </configuration>
最后,hadoop-cluster.xml文件包含集群内namenode和jobtracker的详细信息。事 实上,我们会以集群的名称来命名这个文件,而不是这里显示的那样用“cluster” 来泛指:
<?xml version="1.0"?> <configuration> <property> <name>fs.default.name</name> <value>hdfs://namenode/</value> </property> <property> <name>mapred.job.tracker</name> <value>jobtracker:8021</value> </property> </configuration>
还可以根据需要为这些文件添加其他配置信息,例如,如果想为特定的集群设定Hadoop用户名,则可以在相应的文件中进行这些设置。
设置用户标识 在HDFS中,通过在客户端系统上运行whoami命令来确定Hadoop用户标识 (identity)。类似地,组名(group name)来自groups命令的输出。 如果Hadoop用户标识不同于客户机上的用户账号,可以通过设置 hadoop.job.ugi属性来显式设定Hadoop用户名和组名。用户名和组名由一 个逗号分隔的字符串来表示,例如preston,directors,inventors表示用户 名为 preston,组名是 directors 和 inventors。 可以使用相同的语法设置HDFS网络接口(该接口通过设置dfs.web.ugi来运 行)的用户标识。在默认情况下,webuser和webgroup不是超级用户,因 此,不能通过网络接口访问系统文件。 |
有了这些设置,便可以轻松使用-conf命令行开关来使用各种配置。例如,下面的 命令显示了一个在伪分布式模式下运行于本地主机上的HDFS服务器上的目录 列表:
% hadoop fs -conf conf/hadoop-localhost.xml -Is . Found 2 items dnwxr-xn-x - tom supergroup 0 2009-04-08 10:32 /user/tom/input drwxn-xn-x - tom supergroup 0 2009-04-08 13:09 /usen/tom/output
如果省略-conf选项,可以从conf子目录下的$HADOOP_INSTALL中找到Hadoop 的配置信息。至于独立模式还是伪分布式集群模式,则取决于具体的设置。
Hadoop 自带的工具支持-conf选项,也可以直接用程序(例如运行MapReduce作 业的程序)通过使用Tool接口来支持-conf选项。
辅助类 GenericOptionsParser, Tool 和 ToolRunner
为了简化命令行方式运行作业,Hadoop自带了一些辅助类。GenericOptionsParser是一个类,用来解释常用的Hadoop命令行选项,并根据需要,为Configuration对 象设置相应的取值。通常不直接使用GenericOptionsParser,更方便的方式 是:实现Tool接口,通过ToolRunner来运行应用程序,ToolRunner内部调用 GenericOptionsParser:
public interface Tool extends Configurable { int run(String [] args) throws Exception; }
例5-3给出了一个非常简单的Tool的实现,用来打印Tool的Configuration对象中所有属性的键值对。
例5-3. Tool实现示例,用于打印一个Configuration对象的属性
public class ConfigunationPninten extends Configured implements Tool { static { Configuration.addDefaultResounce("hdfs-default.xml"); Configuration.addDefaultResounce("hdfs-site.xml"); Configuration • addDefaultResource('.mapred-default.xml"); Configuration.addDefaultResounce("mapned-site.xml"); } @Override public int nun(Stning[] angs) throws Exception { Configuration conf = getConf(); for (Entnyentry: conf) { System.out.pnintf("%s=%s\n", entny.getKey(), entny.getValue()); } return 0; } public static void main(Stning[] angs) throws Exception { int exitCode = ToolRunnen.nun(new ConfigunationPninten(), angs); 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 mapred.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的任务槽(〖35让810〖)数,结果会令你失望,因为这个属性只能在 tasktracker的mapred-site.xm!文件中进行设置。一般情况下,可以通过属性名 来告诉组件该属性应该在哪里进行设置,由于 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 mapned.neduce.tasks = n来设置MapReduce作业中reducer的数量。这样会覆盖 集群上或客户端配置属性文件中设置的reducer数量。
GenericOptionsParser和ToolRunner支持的其他选项见表5-1。
用-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 如果希望通过系统属性进行配置,则需要在配置文件中反映相关的系统 属性。
表 5-1. GenericOptionsParser 选项和 ToolRunner 选项
选项名称 | 描述 |
---|---|
-D property=value | 将指定值赋值给确定的Hadoop配置属性。覆盖配置文件 里的默认属性或站点属性,或通过-conf选项设置的任何属性 |
-conf fiLename... | 将指定文件添加到配置的资源列表中。这是设置站点属性 或同时设置一组属性的简便方法 |
-fs uri | 用指定的URI设置默认文件系统。这是-D fs .default. name=uri 的快捷方式 |
-jt host:port | 用指定主机和端口设置如1?1邮匕过。这是-D mapned.job.tnacker= host:port的快捷方式 |
-files file1,file2,... | 从本地文件系统(或任何指定模式的文件系统)中复制指定 文件到jobtradcer所用的共享文件系统(通常是HDFS),确 保在任务工作目录的MapReduce程序可以访问这些文件 |
-archives archive1,archive2,... | 从本地文件系统(或任何指定模式的文件系统)复制指定存 档到jobtracker所用的共享文件系统(通常是HDFS),打开 存档文件,确保任务工作目录的MapReduce程序可以访问 这些存档 |
-libjars jar1,jar2,... | 从本地文件系统(或任何指定模式的文件系统)复制指定 JAR文件到被jobtracker使用的共享文件系统(通常是 HDFS),把它们加入MapReduce任务的类路径中。这个选 项适用于传输作业需要的JAR文件 |