2016-09-06 33 views
1

私はHadoopを初めて使用しており、MapReduceジョブを実行したいと考えています。しかし、私はhadoopがマッパークラスを見つけることができないというエラーを持っています。これはエラーです:Hadoopがマッパークラスを見つけることができません

INFO mapred.JobClient: Task Id : attempt_201608292140_0023_m_000000_0, Status : FAILED 
java.lang.RuntimeException: java.lang.ClassNotFoundException: TransMapper1 
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:857) 
    at org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:199) 
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:718) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:364) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:422) 

私のjarファイルの許可をチェックしても問題ありません。ここでは、MapReduceのジョブを起動するコードのためのコードである

-rwxrwxrwx. 

:ここでは、jarファイルのパーミッションである

import java.io.File; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.NullWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 

public class mp{ 

public static void main(String[] args) throws Exception { 

    Job job1 = new Job(); 
    job1.setJarByClass(mp.class); 
    FileInputFormat.addInputPath(job1, new Path(args[0]));     
    String oFolder = args[0] + "/output"; 
    FileOutputFormat.setOutputPath(job1, new Path(oFolder)); 
    job1.setMapperClass(TransMapper1.class); 
    job1.setReducerClass(TransReducer1.class); 
    job1.setMapOutputKeyClass(LongWritable.class); 
    job1.setMapOutputValueClass(DnaWritable.class); 
    job1.setOutputKeyClass(LongWritable.class); 
    job1.setOutputValueClass(Text.class); 
} 
} 

そして、ここではマッパークラス(TransMapper1)です。

import java.io.IOException; 
import java.util.StringTokenizer; 
import org.apache.hadoop.io.DoubleWritable; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Mapper; 

public class TransMapper1 extends Mapper<LongWritable, Text, LongWritable, DnaWritable> { 

    @Override 
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 

     String line = value.toString(); 
     StringTokenizer tokenizer = new StringTokenizer(line); 
     LongWritable bamWindow = new LongWritable(Long.parseLong(tokenizer.nextToken())); 
     LongWritable read = new LongWritable(Long.parseLong(tokenizer.nextToken())); 
     LongWritable refWindow = new LongWritable(Long.parseLong(tokenizer.nextToken())); 
     IntWritable chr = new IntWritable(Integer.parseInt(tokenizer.nextToken())); 
     DoubleWritable dist = new DoubleWritable(Double.parseDouble(tokenizer.nextToken())); 
     DnaWritable dnaW = new DnaWritable(bamWindow,read,refWindow,chr,dist); 
     context.write(bamWindow,dnaW); 
    } 
} 

私は、次のコマンドを使用してパッケージをコンパイルしています:

javac -classpath $MR_HADOOPJAR ${rootPath}mp/src/*.java 
jar cvfm $mpJar $MR_MANIFEST ${rootPath}mp/src/*.class 

これは、MP/SRC/mp.jarコマンド-tf瓶の結果である:

META-INF/ 
META-INF/MANIFEST.MF 
mnt/miczfs/tide/mp/src/DnaWritable.class 
mnt/miczfs/tide/mp/src/mp.class 
mnt/miczfs/tide/mp/src/TransMapper1.class 
mnt/miczfs/tide/mp/src/TransMapper2.class 
mnt/miczfs/tide/mp/src/TransReducer1.class 
mnt/miczfs/tide/mp/src/TransReducer2.class 

そして、私はこれでジョブを実行しています:

また
mpJar=${rootPath}mp/src/mp.jar 
mp_exec=mp 
export HADOOP_CLASSPATH=$mpJar 
hadoop $mp_exec <input path> 

、私もこのコマンドを試してみました:

hadoop jar $mp_exec <input path> 

私は、このコマンドにjarファイルを作成する方法を変更しました

そして、この変更で、エラーは、このように変更されました。

Exception in thread "main" java.lang.ClassNotFoundException: mp 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:348) 
    at org.apache.hadoop.util.RunJar.main(RunJar.java:153) 

だから、私の問題は、プログラムが今、それはメインクラスを見つけることができない、マッパークラスを見つけることができないということでした前に、 !!!何かご意見は??

はみんな

+0

実際にあなたが取得しているエラーがあります欠落しているクラス@ java.lang.ClassNotFoundExceptionから:TransMapper1、あなたは、HDM上の正しいディレクトリにすべてのJavaソースをコンパイルしていますか?つまり、hadoopはTransMapper1を見つけることができますか?クラスからjarファイルを作成し、hadoopで実行することもできます – D3181

+0

@ Dean219私はコードをコンパイルして実行する方法を追加しました。 HDFSにコンパイルされたファイルをどこに置くべきか教えてください。入力ファイルをHDFSに移動しただけです。 jarファイルも移動する必要がありますか? –

答えて

2

ありがとうHADOOP_CLASSPATHは、クラス定義を見つけることができないため、先のJARファイルがあるフォルダを指定する必要があります。 hadoopコマンドからのMapReduceジョブを実行すると、jarファイル、mainclassおよびその他の引数を必要と

+0

コードをコンパイルして実行する方法を追加し、HADOOP_CLASSPATHをjarファイルの場所に設定しています。しかし、jarファイルはHDFS上にありません。これは現地にあり、これが問題につながる可能性がありますか? –

+0

mp.classファイルの場所を指定していないため、修正して動作します。ありがとうございます –

0

..

Usage: hadoop jar <jar> [mainClass] args... 

だからあなたのアプリケーションのjarファイルを実行するためのコマンドは次のようになります。

hadoop jar $mpJar $mp_exec <inputpath> 
+0

あなたの答えをありがとう。しかし、このように呼び出すと引数0は$ mp_execになります。そして、私が議論の指標を修正したとき。まだ動作していません –

+0

メインクラス($ mp_exec)の後の最初の引数は0ではありません - あなたのケースでは入力パス –

+0

ですが、それは真実ではありません。 mp.javaで2を印刷します。 1つではなく –

関連する問題