【问题标题】:Unable to setup Hadoop in pseudo mode无法在伪模式下设置 Hadoop
【发布时间】:2012-07-14 06:11:53
【问题描述】:

我已经在我的计算机上以伪分布式模式设置了 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 在本地模式下运行的事实。

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

【问题讨论】:

  • 向 fs.default.name 添加一个端口,例如hdfs://localhost:9000/

标签: configuration hadoop


【解决方案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 文件位于类路径中。

【讨论】:

  • 谢谢。甚至在我实施您的建议之前,您为什么说 $HADOOP_INSTALL/conf/*xml 文件中的所有属性都将被导入?毕竟,从输出中可以很清楚地看到 core-site.xml 正在被拾取,无论是否在类路径中。我在这里错过了一些关于类路径的东西吗?
  • 如果您不通过 bin/hadoop 脚本启动代码,则 conf 文件夹将不会添加到类路径中,因此属性将被忽略。 System.out.println(conf) 的输出显示了文件 core-default 和 core-site.xml,但它们只是预期位于类路径上的文件的占位符,如果它们在则将被加载。您已经证明它们没有被加载,因为 fs.default.name 不是您在 core-site.xml 中配置的值
猜你喜欢
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多