Hadoop教程

配置开发环境

首先下载你准备使用的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文件

关注微信获取最新动态