La définition de hadoop.tmp.dir sous Windows donne une erreur: l’URI a un composant autorité

J’essaie de spécifier le répertoire de base pour les fichiers HDFS dans mon hdfs-site.xml sous Windows 7 (Hadoop 2.7.1 que j’ai construit à partir du code source, en utilisant Java SDK 1.8.0_45 et Windows SDK 7.1). Je ne peux pas comprendre comment fournir un chemin qui spécifie un lecteur.

Mon hdfs-site.xml ressemble à ceci:

dfs.replication 1 hadoop.tmp.dir XXX

et j’ai essayé différentes valeurs pour XXX , que j’ai testées avec hdfs namenode -format , toutes conduisant à l’une de ces 2 erreurs:

  • 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.(File.java:423) at org.apache.hadoop.hdfs.server.namenode.NNStorage.getStorageDirectory(NNStorage.java:329) 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.(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

Autres variantes qui ont donné des erreurs similaires: file:///D:/tmp/hdp (de http://hortonworks.com/community/forums/topic/hadoop-configuration-files-issues/ ), file://D:/tmp/hdp , D:\\tmp\\hdp

Et si j’utilise /D/tmp/hdp il ne /D/tmp/hdp pas, mais va dans un dossier D sur mon lecteur actuel.

Je suis à court d’idées, de suggestions? (NB: en plus d’utiliser Cygwin, ce qui n’est pas une option pour moi)

Vous pouvez spécifier une spécification de lecteur dans hadoop.tmp.dir dans core-site.xml en ajoutant un “/” devant le chemin d’access absolu et en utilisant “/” comme séparateur de chemin au lieu de “\” pour tous les éléments du chemin. Par exemple, si le chemin absolu souhaité est D: \ tmp \ hdp, alors cela ressemblerait à ceci:

  hadoop.tmp.dir /D:/tmp/hdp  

La raison pour laquelle cela fonctionne est que les valeurs par défaut pour la plupart des répertoires HDFS sont configurées pour être file://${hadoop.tmp.dir}/suffix . Voir les définitions par défaut de dfs.namenode.name.dir , dfs.datanode.data.dir et dfs.namenode.checkpoint.dir ici:

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

En substituant la valeur ci-dessus à hadoop.tmp.dir , vous hadoop.tmp.dir un file: valide file: URI avec une spécification de lecteur et aucune autorisation, ce qui satisfait aux exigences de la configuration HDFS. Il est important d’utiliser ‘/’ au lieu de ‘\’, car un caractère nu “\” non codé n’est pas valide dans la syntaxe de l’URL.

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

Si vous préférez ne pas utiliser ce comportement de substitution, il est également possible de remplacer toutes les propriétés de configuration qui utilisent hadoop.tmp.dir dans votre fichier hdfs-site.xml. Chaque valeur doit être un file: complet file: URI. Par exemple:

  dfs.namenode.name.dir file:///D:/tmp/hdp/dfs/name   dfs.datanode.data.dir file:///D:/tmp/hdp/dfs/data   dfs.namenode.checkpoint.dir file:///D:/tmp/hdp/dfs/namesecondary  

Vous pourriez trouver cela plus lisible dans l’ensemble.