Apache Hadoop 1.2.1 を使用して map-reduce プログラムを開発しました。Eclipse IDE を使用して最初の開発を行い、すべての入力ファイルと出力ファイルをローカル ファイル システムから取得する Hadoop 分散コンピューティング環境をシミュレートしました。このプログラムは Eclipse で問題なく実行されます。次に、Eclipse を使用して JAR ファイルを作成し、これを 1 つのクラスターの Hadoop マシンで実行しようとすると、エラーが発生します。
Hadoop ジョブをセットアップして実行するコードは次のとおりです。
String outputPath = "/output";
String hadoopInstructionsPath = args[0];
Job job = new Job();
job.setJarByClass(Main.class); //setJarByClass is here but not found apparently?!?
job.setJobName("KLSH");
FileInputFormat.addInputPath(job, new Path(hadoopInstructionsPath));
FileOutputFormat.setOutputPath(job,new Path(outputPath));
job.setMapperClass(KLSHMapper.class);
job.setReducerClass(KLSHReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
System.exit(job.waitForCompletion(true) ? 0:1);
boolean success = job.waitForCompletion(true);
return success ? 0 : 1;
次に、[ファイル] -> [エクスポート] -> [実行可能な JAR ファイル] を使用して Eclipse を使用して jar を作成し、クラスターで実行する JAR ファイルを作成します。
ジョブを実行するために使用するコマンドは次のとおりです (KLSH.jar は JAR ファイルの名前、/hadoopInstruction は args[0] 入力パラメーター、imageFeature.Main/ はメイン クラスの場所を指定します)。
./hadoop jar ./KLSH.jar /hadoopInstructions imageFeatures.Main/
これにより、次の出力が生成されます。
14/11/12 11:11:48 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
14/11/12 11:11:48 WARN mapred.JobClient: No job jar file set. User classes may not be found. See JobConf(Class) or JobConf#setJar(String).
14/11/12 11:11:48 INFO input.FileInputFormat: Total input paths to process : 1
14/11/12 11:11:48 INFO util.NativeCodeLoader: Loaded the native-hadoop library
14/11/12 11:11:48 WARN snappy.LoadSnappy: Snappy native library not loaded
14/11/12 11:11:49 INFO mapred.JobClient: Running job: job_201411051030_0022
14/11/12 11:11:50 INFO mapred.JobClient: map 0% reduce 0%
14/11/12 11:11:56 INFO mapred.JobClient: Task Id : attempt_201411051030_0022_m_000000_0, Status : FAILED
java.lang.RuntimeException: java.lang.ClassNotFoundException: imageFeatures.KLSHMapper
...
マッパークラスが見つからないため、エラーになります。「No job jar file set」という警告が出ますが、コードの最初のブロックで job.setJarByClass を指定したような気がするので、なぜこのエラーがスローされるのかわかりません...
次のコマンドを実行すると、KLSHMapper クラスが JAR にあることもわかります。
jar tf KLSH.jar
かなり多くの出力が得られますが、出力の一部を次に示します。
...
imageFeatures/Main.class
imageFeatures/Feature.class
imageFeatures/FileLoader.class
imageFeatures/KLSHMapper.class
...
明らかに KLSHMapper クラスがそこにあります... Hadoop クラスパスを変更して KLSH.jar パスを含めようとしました。KLSH.jar を DFS にコピーして、上のパスの代わりにそのパスを使用しようとしました。また、-libjars 指定子を使用してジョブを実行しようとしました。何を試しても、hadoop は Mapper クラスを見つけることができないようです。誰かが私が間違っていることを教えてくれますか? Eclipse で動作するコードから、実際の Hadoop クラスターで動作するようにジャンプすることはできないようです。ありがとう!