J'ai installé et configuré Hadoop 2.5.2 pour un cluster à 10 nœuds. 1 agit comme masternode et d'autres nœuds comme esclaves.
J'ai un problème lors de l'exécution des commandes hadoop fs. La commande hadoop fs -ls fonctionne correctement avec l'URI HDFS. Il affiche le message "ls:`. ': Aucun fichier ou répertoire "lorsqu'il est utilisé sans URI HDFS
ubuntu@101-master:~$ hadoop fs -ls
15/01/30 17:03:49 WARN util.NativeCodeLoader: Unable to load native-hadoop
ibrary for your platform... using builtin-Java classes where applicable
ls: `.': No such file or directory
ubuntu@101-master:~$
Attendu que l'exécution de la même commande avec l'URI HDFS
ubuntu@101-master:~$ hadoop fs -ls hdfs://101-master:50000/
15/01/30 17:14:31 WARN util.NativeCodeLoader: Unable to load native-hadoop
library for your platform... using builtin-Java classes where applicable
Found 3 items
drwxr-xr-x - ubuntu supergroup 0 2015-01-28 12:07 hdfs://101-master:50000/hvision-data
-rw-r--r-- 2 ubuntu supergroup 15512587 2015-01-28 11:50 hdfs://101-master:50000/testimage.seq
drwxr-xr-x - ubuntu supergroup 0 2015-01-30 17:03 hdfs://101-master:50000/wrodcount-in
ubuntu@101-master:~$
Je reçois une exception dans le programme MapReduce en raison de ce comportement. jarlib fait référence à l'emplacement du fichier HDFS, alors que je veux que jarlib fasse référence aux fichiers jar stockés sur le système de fichiers local sur les nœuds Hadoop.
Le comportement que vous voyez est attendu, laissez-moi vous expliquer ce qui se passe lorsque vous travaillez avec hadoop fs
commandes.
La syntaxe de la commande est la suivante: hadoop fs -ls [path]
Par défaut, lorsque vous ne spécifiez pas [path]
pour la commande ci-dessus, hadoop étend le chemin vers /home/[username]
dans hdfs; où [username]
est remplacé par le nom d'utilisateur linux qui exécute la commande.
Ainsi, lorsque vous exécutez cette commande:
ubuntu@xad101-master:~$ hadoop fs -ls
la raison pour laquelle vous voyez l'erreur est ls: '.': No such file or directory
parce que hadoop cherche ce chemin /home/ubuntu
, il semble que ce chemin n'existe pas dans hdfs.
La raison pour laquelle cette commande:
ubuntu@101-master:~$ hadoop fs -ls hdfs://101-master:50000/
fonctionne car, vous avez explicitement spécifié [path]
et est la racine des hdfs. Vous pouvez également faire de même en utilisant ceci:
ubuntu@101-master:~$ hadoop fs -ls /
qui est automatiquement évalué à la racine de hdfs.
J'espère que cela efface le comportement que vous voyez lors de l'exécution de hadoop fs -ls
commande.
Par conséquent, si vous souhaitez spécifier le chemin d'accès au système de fichiers local, utilisez file:///
schéma d'url.
cela a à voir avec le répertoire personnel manquant pour l'utilisateur. Une fois que j'ai créé le répertoire personnel sous hdfs pour l'utilisateur connecté, cela a fonctionné comme un charme ..
hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/{loggedin user}
hdfs dfs -ls
cette méthode a résolu mon problème.
Le répertoire utilisateur dans Hadoop est (en HDFS)
/user/<your operational system user>
Si vous obtenez ce message d'erreur, cela peut être dû au fait que vous n'avez pas encore créé votre répertoire utilisateur dans HDFS.
Utilisation
hadoop fs -mkdir -p /user/<current o.p. user directory>
Pour voir quel est votre utilisateur actuel du système d'exploitation, utilisez:
id -un
hadoop fs -ls
il devrait commencer à fonctionner ...
Il y a quelques choses à l'œuvre ici; basé sur "jarlib fait référence à l'emplacement du fichier HDFS", il semble que vous ayez en effet un chemin HDFS défini comme votre fs.default.name
, qui est en effet la configuration typique. Ainsi, lorsque vous tapez hadoop fs -ls
, c'est en effet essayer de regarder à l'intérieur de HDFS, sauf qu'il regarde dans votre répertoire de travail actuel , qui devrait être quelque chose comme hdfs://101-master:50000/user/ubuntu
. Le message d'erreur est malheureusement quelque peu déroutant car il ne vous dit pas que .
a été interprété comme le chemin complet. Si vous hadoop fs -mkdir /user/ubuntu
puis hadoop fs -ls
devrait commencer à fonctionner.
Ce problème n'est pas lié à votre problème "jarlib"; chaque fois que vous souhaitez référencer des fichiers stockés explicitement dans le système de fichiers local, mais lorsque le chemin passe par la résolution Path
de Hadoop, vous devez simplement ajouter file:///
pour forcer Hadoop à se référer au système de fichiers local. Par exemple:
hadoop fs -ls file:///tmp
Essayez de passer les chemins de vos fichiers jar en tant que fille file:///path/to/your/jarfile
et ça devrait marcher.