2016-09-22 9 views
0

男性と女性の平均年齢を計算する単純なMapReduceプログラムを実行しようとしています。私はそれを実行しようとしているとき、それは私にClass Not Found Exception(Titanicクラス)を与えています。私は同様の答えを提供している多くの質問を発見したし、私は私のプログラムを変更したに基づいて、それでも私は同じエラーを与えている。もし誰かがそれをデバッグできるのであれば、本当に役に立ちます。以下Hadoop Javaエラー:スレッド "main"の例外java.lang.ClassNotFoundException:Titanic

import java.io.IOException; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.conf.*; 
import org.apache.hadoop.io.*; 
import org.apache.hadoop.mapreduce.*; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; 

public class Titanic{ 
public static class Map extends Mapper<LongWritable, Text, Text, IntWritable>{ 
    private Text category = new Text(); 
    public void map(LongWritable key, Text text, Context context) throws IOException, InterruptedException{ 
     String line = text.toString(); 
     String str[] = line.split(","); 
     if(str[4] == "male"){ 
      category.set(str[4]); 
     }else{ 
      category.set(str[4]); 
     } 
     IntWritable value = new IntWritable(Integer.parseInt(str[5])); 
     context.write(category,value); 
    } 

} 

public static class Reduce extends Reducer<Text, IntWritable, Text, FloatWritable>{ 

    public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException{ 
     float average = 0; 
     int count =0; 
     for(IntWritable val : values){ 
       average = average+val.get(); 
       count = count + 1;    
     } 
     average =average/count; 
     context.write(key, new FloatWritable(average)); 

    } 

} 

public static void main(String[] args) throws Exception{ 
    Configuration conf = new Configuration(); 
    Job job = Job.getInstance(conf, "titanic"); 
    job.setJarByClass(Titanic.class); 
    job.setMapperClass(Map.class); 
    job.setReducerClass(Reduce.class); 
    job.setMapOutputKeyClass(Text.class); 
    job.setMapOutputValueClass(IntWritable.class); 
    FileInputFormat.addInputPath(job, new Path(args[0])); 
    FileOutputFormat.setOutputPath(job, new Path(args[1])); 
    System.exit(job.waitForCompletion(true) ? 0 : 1);  
} 

}

私はそれを実行したコマンドです。

jarファイルを作成:

jar cf example/titanic/titanic.jar example/titanic/Titanic*.class 

は、jarファイルを実行する:

bin/hadoop jar example/titanic/titanic.jar Titanic /user/akhil/titanic/input/TitanicData.txt /user/akhil/titanic/output/ 
+0

どのクラスが見つかりませんか? –

答えて

0

ジャーをしているめちゃくちゃれます。あなたのクラスがデフォルトのパッケージに属している場合、それらはexample/titanic/ディレクトリの下に置くべきではなく、ルートディレクトリの下に置くべきです。

+0

私のTitanic.javaファイルは/ example/titanicフォルダの下にあります。私がそれをコンパイルすると、/ example/titanicフォルダの下に3つのクラスファイルが作成されています。だから私は同じフォルダの下にjarファイルを作成し、それを実行しました。私はpackageステートメントを持っていないので、デフォルトのパッケージを持っています。 –

+0

さて、クラスをデフォルトパッケージのままにしておき、 'cd example/titanic && jar cf titanic.jar * .class && cd -'を実行して、同じhadoopコマンドを実行することができます。または、あなたのJavaクラスの最初の行に 'package example.titanic;'ステートメントを追加し、再コンパイルして再パッケージし、 'bin/hadoop jar example/titanic/titanic.jar example.titanic.Titanic/user/akhil/titanic /input/TitanicData.txt/user/akhil/titanic/output/'と入力します。 https://docs.oracle.com/javase/tutorial/java/package/managingfiles.html – patrungel

+0

素晴らしいです。ご協力いただきありがとうございます。 –

0

は*を削除します。

jar cf example/titanic/titanic.jar example/titanic/Titanic.class 
+0

同じエラーです。 Titanic $ Map.classとTitanic $ Reduce.classのような他のクラスもありますので、*それらすべてを含みます。私はこれらのファイルをjarファイルに含める必要があると思います。 –

関連する問題