J'ai installé Hadoop 2.6 dans Ubuntu Linux 15.04 et tout fonctionne bien. Mais, lorsque j’exécute un exemple de programme de test mapreduce, cela donne l’erreur suivante:
org.Apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: hdfs://localhost:54310/user/hduser/input.
Aidez-moi gentiment. Vous trouverez ci-dessous les détails complets de l'erreur.
hduser@krishadoop:/usr/local/hadoop/sbin$ hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount input output
Picked up Java_TOOL_OPTIONS: -javaagent:/usr/share/Java/jayatanaag.jar
15/08/24 15:22:37 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-Java classes where applicable
15/08/24 15:22:38 INFO Configuration.deprecation: session.id is deprecated. Instead, use dfs.metrics.session-id
15/08/24 15:22:38 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
15/08/24 15:22:39 INFO mapreduce.JobSubmitter: Cleaning up the staging area file:/app/hadoop/tmp/mapred/staging/hduser1122930879/.staging/job_local1122930879_0001
org.Apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: hdfs://localhost:54310/user/hduser/input
at org.Apache.hadoop.mapreduce.lib.input.FileInputFormat.singleThreadedListStatus(FileInputFormat.Java:321)
at org.Apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(FileInputFormat.Java:264)
at org.Apache.hadoop.mapreduce.lib.input.FileInputFormat.getSplits(FileInputFormat.Java:385)
at org.Apache.hadoop.mapreduce.JobSubmitter.writeNewSplits(JobSubmitter.Java:597)
at org.Apache.hadoop.mapreduce.JobSubmitter.writeSplits(JobSubmitter.Java:614)
at org.Apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.Java:492)
at org.Apache.hadoop.mapreduce.Job$10.run(Job.Java:1296)
at org.Apache.hadoop.mapreduce.Job$10.run(Job.Java:1293)
at Java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.Java:415)
at org.Apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.Java:1628)
at org.Apache.hadoop.mapreduce.Job.submit(Job.Java:1293)
at org.Apache.hadoop.mapreduce.Job.waitForCompletion(Job.Java:1314)
at org.Apache.hadoop.examples.WordCount.main(WordCount.Java:87)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:606)
at org.Apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.Java:71)
at org.Apache.hadoop.util.ProgramDriver.run(ProgramDriver.Java:144)
at org.Apache.hadoop.examples.ExampleDriver.main(ExampleDriver.Java:74)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:606)
at org.Apache.hadoop.util.RunJar.run(RunJar.Java:221)
at org.Apache.hadoop.util.RunJar.main(RunJar.Java:136)
On dirait que vous avez mentionné un mauvais chemin d’entrée. Hadoop recherche un chemin d’entrée à /user/hduser/input
. Hadoop suit également unix comme une arborescence. Si vous mentionnez simplement un répertoire input
, il sera pris comme /user/{username}/input
.
hadoop fs -mkdir -p /user/hduser/input
hadoop fs -put <datafile> /user/hduser/input
Si vous voyez ce chemin (fichier) physiquement et obtenez toujours l'erreur, vous avez peut-être confondu avec le système de fichiers local et le système de fichiers distribués Hadoop (HDFS). Pour pouvoir exécuter cette réduction de carte, ce fichier doit être situé dans HDFS (la localisation dans le système de fichiers local ne le fera pas.).
Vous pouvez importer des fichiers du système de fichiers local dans HDFS à l'aide de cette commande.
hadoop fs -put <local_file_path> <HDFS_diresctory>
Vous confirmez que le fichier que vous avez importé existe dans HDFS avec cette commande.
hadoop fs -ls <HDFS_path>
Vous devez démarrer Pig en mode local et non en cluster:
cochon -x local
Vous devez créer et télécharger vos entrées avant d'exécuter votre tâche hadoop. Par exemple, si vous devez télécharger le fichier input.txt
, procédez comme suit:
$HADOOP_HOME/bin/hdfs dfs -mkdir /user/hduser/input
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal $HADOOP_HOME/input.txt /user/hduser/input/input.txt
La première ligne crée le répertoire et l’autre télécharge votre fichier d’entrée dans hdfs (hadoop fylesystem).
Le programme ne peut pas trouver le chemin Hadoop pour les entrées. Il effectue une recherche dans les fichiers système locaux plutôt que dans DFS de Hadoop.
Ce problème disparaîtra lorsque votre programme pourra localiser l’emplacement HDFS. Nous devons laisser le programme comprendre l'emplacement HDFS indiqué dans le fichier de configuration. Pour ce faire, ajoutez ces lignes dans votre code de programme.
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/hadoop-2.7.3/etc/hadoop/core-site.xml"));
conf.addResource(new Path("/usr/local/hadoop/hadoop-2.7.3/etc/hadoop/hdfs-site.xml"));
Lorsque vous compilez un fichier JAR à l'aide d'un fichier/répertoire d'entrée et de sortie, vous devez vous assurer que le fichier d'entrée est déjà créé (dans le chemin spécifié) et que le fichier de sortie n'existe pas.
Si vous souhaitez donner un fichier texte en tant que fichier d'entrée, copiez d'abord un fichier texte du système de fichiers local sur hdfs et compilez-le à l'aide des commandes suivantes.
hadoop fs -copyFromLocal /input.txt /user/hduser/input.txt
/usr/local/hadoop/sbin$ yarn jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount /user/hduser/input.txt /output
/input.txt peut être remplacé par l'adresse de n'importe quel fichier texte.