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



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

我的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:tmphdp: ERROR common.Util: Syntax error in URI file://D:tmphdp/dfs/name

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

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

我没主意了,有什么建议吗?(注:除了使用Cygwin,这不是我的选择)

您可以在core-site.xml中通过在绝对路径前面添加'/'来指定hadoop.tmp.dir中的驱动器规格,并使用'/'作为所有路径元素的路径分隔符而不是''。例如,如果期望的绝对路径是D:tmphdp,那么它看起来像这样:

<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>

最新更新