我试图在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\hdp
:ERROR 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/hdp
,D:\\tmp\\hdp
如果我使用/D/tmp/hdp
它不会崩溃,但会进入我当前驱动器上的D
文件夹。
我出于想法,有什么建议吗? (注意:除了使用Cygwin,这对我来说不是一个选项)
答案 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.dir
,dfs.datanode.data.dir
和dfs.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>
您可能会发现整体更具可读性。