[HADOOP] 하둡이 매퍼 클래스를 찾을 수 없습니다
HADOOP하둡이 매퍼 클래스를 찾을 수 없습니다
하둡을 처음 사용하고 MapReduce 작업을 실행하고 싶습니다. 그러나 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 파일의 권한을 확인했는데 괜찮습니다. 다음은 jar 파일의 권한입니다.
-rwxrwxrwx.
다음은 mapreduce 작업을 시작하는 코드의 코드입니다.
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
이것은 jar -tf mp / src / mp.jar 명령의 결과입니다.
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 파일을 작성하는 방법을이 명령으로 변경했습니다.
jar cf $mpJar $MR_MANIFEST ${rootPath}mp/src/*.class
그리고이 변경으로 오류가 다음과 같이 변경되었습니다.
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)
그래서 내 문제 전에 프로그램이 매퍼 클래스를 찾을 수 없다는 것이 었습니다. 지금은 메인 클래스를 찾을 수 없습니다 !!! 이견있는 사람??
고마워
해결법
-
==============================
1.HADOOP_CLASSPATH는 JAR 파일이있는 폴더를 지정해야하므로 클래스 정의를 찾을 수 없습니다.
HADOOP_CLASSPATH는 JAR 파일이있는 폴더를 지정해야하므로 클래스 정의를 찾을 수 없습니다.
-
==============================
2.hadoop 명령에서 Mapreduce 작업을 실행하려면 jar 파일, 기본 클래스 및 기타 인수가 필요합니다.
hadoop 명령에서 Mapreduce 작업을 실행하려면 jar 파일, 기본 클래스 및 기타 인수가 필요합니다.
Usage: hadoop jar <jar> [mainClass] args...
따라서 응용 프로그램 jar을 실행하기위한 명령은 다음과 같아야합니다.
hadoop jar $mpJar $mp_exec <inputpath>
from https://stackoverflow.com/questions/39359412/hadoop-can-not-find-the-mapper-class by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] java.lang.Exception : java.lang.NoClassDefFoundError : org / apache / lucene / util / OpenBitSet (0) | 2019.09.12 |
---|---|
[HADOOP] hadoop에서 데이터 노드 포트를 지정하는 방법 (0) | 2019.09.12 |
[HADOOP] 스칼라 형식 불일치 오류를 상속해야합니다 (0) | 2019.09.12 |
[HADOOP] 하둡 FileSystem.getFS ()가 약 2 분 동안 일시 중지됨 (0) | 2019.09.12 |
[HADOOP] 연결 예외에서 hadoop fs -mkdir이 실패했습니다. (0) | 2019.09.12 |