2015-07-11 5 views
3

Я пытаюсь указать базовый каталог файлов HDFS в моем hdfs-site.xml под Windows 7 (Hadoop 2.7.1, который я построил из исходного кода, используя Java SDK 1.8.0_45 и Windows SDK 7.1). Я не могу понять, как указать путь, определяющий диск.Настройка hadoop.tmp.dir на Windows дает ошибку: URI имеет компонент полномочий

Мой 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, все это ведет к одному из этих 2-х ошибок:

  • 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 папку на моем текущем диске.

У меня нет идей, предложений? (NB: помимо использования Cygwin, который не является для меня вариантом)

ответ

5

Вы можете указать спецификацию диска в hadoop.tmp.dir в файле core-site.xml, добавив '/' перед абсолютным путем и используя '/ 'в качестве разделителя пути вместо' \ 'для всех элементов пути. Например, если желаемый абсолютный путь 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

Если вы предпочитаете не полагаться на такое поведение замещения, то это справедливо, чтобы переопределить все свойства конфигурации, которые используют hadoop.tmp.dir в файле HDFS-site.xml. Каждое значение должно быть полным 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> 

Возможно, вы найдете это более читаемым в целом.

+0

Большое спасибо, работает как шарм! – tiho