Ubuntu Linux 15.04にhadoop 2.6をインストールし、正常に動作しました。しかし、サンプルのテストmapreduceプログラムを実行すると、次のエラーが発生します。
org.Apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: hdfs://localhost:54310/user/hduser/input.
親切に助けてください。以下はエラーの詳細です。
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)
間違った入力パスについて言及したようです。 Hadoopは/user/hduser/input
で入力パスを検索しています。 Hadoopは、Unixのようなツリー構造にも従います。ディレクトリinput
に言及するだけであれば、/user/{username}/input
として解釈されます。
hadoop fs -mkdir -p /user/hduser/input
hadoop fs -put <datafile> /user/hduser/input
このパス(ファイル)を物理的に確認してもエラーが発生する場合は、ローカルファイルシステムとHadoop分散ファイルシステム(HDFS)と混同している可能性があります。このmap-reduceを実行するには、このファイルをHDFSに配置する必要があります(ローカルファイルシステム内にのみ配置することはできません)。
このコマンドを使用して、ローカルファイルシステムファイルをHDFSにインポートできます。
hadoop fs -put <local_file_path> <HDFS_diresctory>
このコマンドを使用して、インポートしたファイルがHDFSに存在することを確認します。
hadoop fs -ls <HDFS_path>
クラスタノードではなく、ローカルモードでPigを起動する必要があります。
pig -xローカル
Hadoopジョブを実行する前に、入力を作成してアップロードする必要があります。たとえば、input.txt
ファイル、次の操作を行う必要があります。
$HADOOP_HOME/bin/hdfs dfs -mkdir /user/hduser/input
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal $HADOOP_HOME/input.txt /user/hduser/input/input.txt
1行目はディレクトリを作成し、もう1行は入力ファイルをhdfs(hadoop fylesystem)にアップロードします。
プログラムは入力のHadoopパスを見つけることができません。 HadoopのDFSではなく、ローカルシステムファイルを検索しています。
この問題は、プログラムがHDFSの場所を特定できれば解消されます。設定ファイルで指定されたHDFSの場所をプログラムに認識させる必要があります。これを行うには、これらの行をプログラムコードに追加します。
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"));
hadoop jar jarFileName.jar className /input_dir /outputdir
右以下はwrongです。これは相対パスであるためですhadoop jar jarFileName.jar className input_dir outputdir
wrong
入力および出力ファイル/ディレクトリを使用してjarファイルをコンパイルするときは、入力ファイルがすでに(指定されたパスに)作成されており、出力ファイルが存在しないことを確認する必要があります。
テキストファイルを入力ファイルとして提供する場合は、まずテキストファイルをローカルファイルシステムからhdfsにコピーし、次のコマンドを使用してコンパイルします。
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は、任意のテキストファイルのアドレスに置き換えることができます。