복붙노트

[HADOOP] java.lang.VerifyError with Hadoop

HADOOP

java.lang.VerifyError with Hadoop

Hadoop을 사용하는 자바 프로젝트에서 일하고 있는데 java.lang.VerifyError가 있는데 어떻게 해결해야할지 모르겠다. 같은 유형의 질문을 가진 사람들이 대답이 없거나 솔루션이 제 경우에는 작동하지 않는다는 것을 알았습니다.

내 수업 :

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.NullOutputFormat;

public class GetStats {

    public static List<Statistique> stats; // class with one String an one int

    public static class TokenizerMapper extends
            Mapper<Object, Text, Text, IntWritable> {

        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();

        public void map(Object key, Text value, Context context)
                throws IOException, InterruptedException {
            StringTokenizer itr = new StringTokenizer(value.toString());
            while (itr.hasMoreTokens()) {
                word.set(itr.nextToken());
                context.write(word, one);
            }
        }
    }

    public static class IntSumReducer extends
            Reducer<Text, IntWritable, Text, IntWritable> {
        private IntWritable result = new IntWritable();

        public void reduce(Text key, Iterable<IntWritable> values,
                Context context) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) {
                sum += val.get();
            }
            result.set(sum);
            if (key.toString().contains("HEAD")
                    || key.toString().contains("POST")
                    || key.toString().contains("GET")
                    || key.toString().contains("OPTIONS")
                    || key.toString().contains("CONNECT"))
                GetStats.stats.add(new Statistique(key.toString().replace("\"", ""), sum));
            context.write(key, result);
        }
    }

    public static void main(String[] args) throws Exception {
        System.out.println("Start wc");
        stats = new ArrayList<>();

//      File file = new File("err.txt");
//      FileOutputStream fos = new FileOutputStream(file);
//      PrintStream ps = new PrintStream(fos);
//      System.setErr(ps);

        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "word count");
        job.setJarByClass(GetStats.class);
        job.setMapperClass(TokenizerMapper.class);
//      job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        FileInputFormat.addInputPath(job, new Path("input"));
        job.setOutputFormatClass(NullOutputFormat.class);

        job.waitForCompletion(true);

        System.out.println(stats);
        System.out.println("End");
    }
}

및 오류 :

Exception in thread "main" java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    org/apache/hadoop/mapred/JobTrackerInstrumentation.create(Lorg/apache/hadoop/mapred/JobTracker;Lorg/apache/hadoop/mapred/JobConf;)Lorg/apache/hadoop/mapred/JobTrackerInstrumentation; @5: invokestatic
  Reason:
    Type 'org/apache/hadoop/metrics2/lib/DefaultMetricsSystem' (current frame, stack[2]) is not assignable to 'org/apache/hadoop/metrics2/MetricsSystem'
  Current Frame:
    bci: @5
    flags: { }
    locals: { 'org/apache/hadoop/mapred/JobTracker', 'org/apache/hadoop/mapred/JobConf' }
    stack: { 'org/apache/hadoop/mapred/JobTracker', 'org/apache/hadoop/mapred/JobConf', 'org/apache/hadoop/metrics2/lib/DefaultMetricsSystem' }
  Bytecode:
    0000000: 2a2b b200 03b8 0004 b0                

    at org.apache.hadoop.mapred.LocalJobRunner.<init>(LocalJobRunner.java:573)
    at org.apache.hadoop.mapred.JobClient.init(JobClient.java:494)
    at org.apache.hadoop.mapred.JobClient.<init>(JobClient.java:479)
    at org.apache.hadoop.mapreduce.Job$1.run(Job.java:563)
    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:1657)
    at org.apache.hadoop.mapreduce.Job.connect(Job.java:561)
    at org.apache.hadoop.mapreduce.Job.submit(Job.java:549)
    at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:580)
    at hadoop.GetStats.main(GetStats.java:79)

너는 어떤 생각을 가지고 있니? 나를 도울 수있는 무언가가 더 필요하면 그냥 물어보십시오.

해결법

  1. ==============================

    1.나는 내 문제를 해결했다.

    나는 내 문제를 해결했다.

    가져온 항아리는 좋았지 만 이전에 시도했던 다른 버전 (아마도 오래된 버전)도 프로젝트 폴더에있었습니다. 수업을 호출 할 때 이전 버전의 병이 사용 된 것처럼 보입니다. 또한, 그 항아리는 제가 수업 경로에서 원했던 항성보다 앞에있었습니다. 이전 폴더를 프로젝트 폴더에서 삭제하면 제대로 작동합니다.

  2. from https://stackoverflow.com/questions/30163766/java-lang-verifyerror-with-hadoop by cc-by-sa and MIT license