在Windows上设置hadoop.tmp.dir会出错:URI具有权限组件

时间:2015-07-11 03:52:59

标签: java windows hadoop hdfs

我试图在Windows 7下的hdfs-site.xml中指定HDFS文件的基本目录(我使用Java SDK 1.8.0_45和Windows SDK 7.1从源代码构建的Hadoop 2.7.1)。我无法弄清楚如何提供指定驱动器的路径。

我的hdfs-site.xml看起来像这样:

<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>hadoop.tmp.dir</name> <value>XXX</value> </property> </configuration>

我尝试了XXX的各种值,我使用hdfs namenode -format进行了测试,这些都导致了以下两个错误之一:

  • XXX=D:/tmp/hdp 15/07/10 23:38:33 ERROR namenode.NameNode: Failed to start namenode. java.lang.IllegalArgumentException: URI has an authority component at java.io.File.<init>(File.java:423) at org.apache.hadoop.hdfs.server.namenode.NNStorage.getStorageDirectory(NNStorage.java:329)
  • XXX=D:\tmp\hdpERROR common.Util: Syntax error in URI file://D:\tmp\hdp/dfs/name

出现类似错误的其他变体:file:///D:/tmp/hdp(来自http://hortonworks.com/community/forums/topic/hadoop-configuration-files-issues/),file://D:/tmp/hdpD:\\tmp\\hdp

如果我使用/D/tmp/hdp它不会崩溃,但会进入我当前驱动器上的D文件夹。

我出于想法,有什么建议吗? (注意:除了使用Cygwin,这对我来说不是一个选项)

1 个答案:

答案 0 :(得分:5)

您可以在core-site.xml中的hadoop.tmp.dir中指定驱动器规范,方法是在绝对路径前加一个'/',并使用'/'作为路径分隔符而不是'\'表示所有路径元素。例如,如果所需的绝对路径是D:\ tmp \ hdp,那么它将如下所示:

<property>
    <name>hadoop.tmp.dir</name>
    <value>/D:/tmp/hdp</value>
</property>

这样做的原因是许多HDFS目录的默认值都配置为file://${hadoop.tmp.dir}/suffix。请在此处查看dfs.namenode.name.dirdfs.datanode.data.dirdfs.namenode.checkpoint.dir的默认定义:

http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

hadoop.tmp.dir的上述值替换为带有驱动器规范且无权限的有效file: URI,满足HDFS配置的要求。使用'/'代替'\'很重要,因为在URL语法中,未编码的'\'字符无效。

http://www.ietf.org/rfc/rfc1738.txt

如果您不想依赖此替换行为,那么覆盖在hdfs-site.xml文件中使用hadoop.tmp.dir的所有配置属性也是有效的。每个值必须是完整的file: URI。例如:

<property>
    <name>dfs.namenode.name.dir</name>
    <value>file:///D:/tmp/hdp/dfs/name</value>
</property>

<property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///D:/tmp/hdp/dfs/data</value>
</property>

<property>
    <name>dfs.namenode.checkpoint.dir</name>
    <value>file:///D:/tmp/hdp/dfs/namesecondary</value>
</property>

您可能会发现整体更具可读性。