我试图在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
文件夹。
您可以在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.dir
、dfs.datanode.data.dir
和dfs.namenode.checkpoint.dir
的默认定义:
将上面的值替换为hadoop.tmp.dir
,得到一个有效的file:
URI,带有驱动器规范,没有权限,满足HDFS配置的要求。使用'/'而不是''很重要,因为未编码的''字符在URL语法中是无效的。
如果您不希望依赖这种替换行为,那么在您的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>