0

我已经在我的计算机上以伪分布式模式设置了 Hadoop。我按照“Hadoop - A Definitive Guide”一书附录 A 中的说明在伪分布式模式下设置 Hadoop。

但是,从以下程序的输出中,可以安全地推断出我的 Hadoop 正在运行到独立模式(即本地模式)。

public static void main(String[] args) {
    Configuration conf = new Configuration();
    System.out.println(conf);
    System.out.println(conf.get("fs.default.name"));
}

输出:

Configuration: core-default.xml, core-site.xml
file:///

输出file:///代替hdfs://localhost. 但是,其中的属性core-site.xml已正确设置:

<configuration>
        <property>
                <name>fs.default.name</name>
                <value>hdfs://localhost/</value>
        </property>
</configuration>

此外,当我从 Eclipse 提交测试作业时,它不会出现在 jobTracker 浏览器 UI 中,我在某处读到这是由于 Hadoop 以本地模式运行的事实。

请让我知道我的配置有什么问题以及如何启用伪分布式模式。为什么我不能fs.default.name用我在文件中指定的属性覆盖默认 XML 文件中的属性core-site.xml

4

1 回答 1

1

你是如何启动程序的?如果您不使用 bin/hadoop 脚本,则 conf/*.xml 中的配置文件将不在类路径中,因此其中的任何值都将被忽略。

您还应该使用 ToolRunner 启动器:

public class MyJobDriver extends Configured implements Tool {
  public static void main(String args[]) {
    ToolRunner.run(new MyJobDriver(), args);
  }

  public int run(String args[]) {
    Job job = new Job(getConf());
    Configuration conf = job.getConfiguration();

    System.out.println(conf);
    System.out.println(conf.get("fs.default.name"));

    return 0;
  }
}

此代码中需要注意的其他一些要点:

  • 请记住使用 getConf() 提供的配置创建您的作业 - 这允许您使用通用选项解析器来解析一些常见的命令行开关(-files、-jt、-fs、=Dkey=value 等)
  • 如果您需要配置来设置一些自定义参数 - 使用 job.getConfiguration() 获取作业副本 - 因为 Job 在您构建它时会进行深层复制,并且在作业运行时不会应用对原始文件的任何更改

然后确保您的作业使用 bin/hadoop 脚本运行:

#> bin/hadoop MyApp.jar a.b.c.MyAppDriver

如果您从 Eclipse 启动,请确保 $HADOOP_HOME/conf 文件夹位于类路径中,并且当 ToolRunner 创建配置对象时,将确保 xml conf 文件位于类路径中。

于 2012-07-14T11:49:06.513 回答