classnotfound异常

t2a7ltrp  于 2021-05-29  发布在  Hadoop
关注(0)|答案(0)|浏览(316)

我想在hadoop中实现多模式匹配。作为第一步,我将实现booyermoore实现。我得到一个类没有发现异常。代码如下:

package saihadoopboyer;

import saihadoopboyer.BoyerMoore;
import java.io.IOException;
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.FileOutputFormat;

public class BoyerMooreImpl {
     public static class TokenizerMapper
     extends Mapper<Object, Text, Text, IntWritable>{
  private BoyerMoore boyerMoore;
  private static IntWritable offset;
  private Text offsetFound = new Text("offset");

  public void map(Object key, Text value, Context context
                  ) throws IOException, InterruptedException {
    StringTokenizer itr = new StringTokenizer(value.toString());
    while (itr.hasMoreTokens()) {
        String line = itr.nextToken();
        int offset1 = boyerMoore.search(line);
        if (line.length() != offset1) {
            offset = new IntWritable(offset1);
            context.write(offsetFound,offset);
        }
    }
  }
  @Override
  public final void setup(Context context) {
      if (boyerMoore == null)
          boyerMoore = new BoyerMoore(context.getConfiguration().get("pattern"));
  }
}

public static void main(String[] args) throws Exception {
  Configuration conf = new Configuration();
  conf.set("pattern","sai");
  Job job = Job.getInstance(conf, "BoyerMoore");
  job.setJarByClass(BoyerMooreImpl.class);
  job.setMapperClass(TokenizerMapper.class);
  job.setOutputKeyClass(Text.class);
  job.setOutputValueClass(IntWritable.class);
  FileInputFormat.addInputPath(job, new Path(args[0]));
  FileOutputFormat.setOutputPath(job, new Path(args[1]));
  System.exit(job.waitForCompletion(true) ? 0 : 1);
}

}

Booyermore calss的实现如下:

package saihadoopboyer;

public class BoyerMoore {
        private final int R;     // the radix
        private int[] right;     // the bad-character skip array

        private char[] pattern;  // store the pattern as a character array
        private String pat;      // or as a string

        /**
         * Preprocesses the pattern string.
         *
         * @param pat the pattern string
         */
        public BoyerMoore(String pat) {
            this.R = 256;
            this.pat = pat;

            // position of rightmost occurrence of c in the pattern
            right = new int[R];
            for (int c = 0; c < R; c++)
                right[c] = -1;
            for (int j = 0; j < pat.length(); j++)
                right[pat.charAt(j)] = j;
        }

        /**
         * Preprocesses the pattern string.
         *
         * @param pattern the pattern string
         * @param R the alphabet size
         */
        public BoyerMoore(char[] pattern, int R) {
            this.R = R;
            this.pattern = new char[pattern.length];
            for (int j = 0; j < pattern.length; j++)
                this.pattern[j] = pattern[j];

            // position of rightmost occurrence of c in the pattern
            right = new int[R];
            for (int c = 0; c < R; c++)
                right[c] = -1;
            for (int j = 0; j < pattern.length; j++)
                right[pattern[j]] = j;
        }

        /**
         * Returns the index of the first occurrrence of the pattern string
         * in the text string.
         *
         * @param  txt the text string
         * @return the index of the first occurrence of the pattern string
         *         in the text string; n if no such match
         */
        public int search(String txt) {
            int m = pat.length();
            int n = txt.length();
            int skip;
            for (int i = 0; i <= n - m; i += skip) {
                skip = 0;
                for (int j = m-1; j >= 0; j--) {
                    if (pat.charAt(j) != txt.charAt(i+j)) {
                        skip = Math.max(1, j - right[txt.charAt(i+j)]);
                        break;
                    }
                }
                if (skip == 0) return i;    // found
            }
            return n;                       // not found
        }

        /**
         * Returns the index of the first occurrrence of the pattern string
         * in the text string.
         *
         * @param  text the text string
         * @return the index of the first occurrence of the pattern string
         *         in the text string; n if no such match
         */
        public int search(char[] text) {
            int m = pattern.length;
            int n = text.length;
            int skip;
            for (int i = 0; i <= n - m; i += skip) {
                skip = 0;
                for (int j = m-1; j >= 0; j--) {
                    if (pattern[j] != text[i+j]) {
                        skip = Math.max(1, j - right[text[i+j]]);
                        break;
                    }
                }
                if (skip == 0) return i;    // found
            }
            return n;                       // not found
        }

/**
 * Takes a pattern string and an input string as command-line arguments;
 * searches for the pattern string in the text string; and prints
 * the first occurrence of the pattern string in the text string.
 */
/*      
public static void main(String[] args) {
    String pat = "sai";
    String txt = "babababasaibaba";
    char[] pattern = pat.toCharArray();
    char[] text    = txt.toCharArray();

    BoyerMoore boyermoore1 = new BoyerMoore(pat);
    BoyerMoore boyermoore2 = new BoyerMoore(pattern, 256);
    int offset1 = boyermoore1.search(txt);
    int offset2 = boyermoore2.search(text);

    // print results
    System.out.println("text:    " + txt);

    System.out.println("pattern: ");
    for (int i = 0; i < offset1; i++)
        System.out.println(" ");
    System.out.println(pat);

    System.out.println("pattern: ");
    for (int i = 0; i < offset2; i++)
        System.out.println(" ");
    System.out.println(pat);
}*/
}

我的jar-tf输出如下:

META-INF/MANIFEST.MF
.classpath
saihadoopboyer/BoyerMoore.class
saihadoopboyer/BoyerMooreImpl$TokenizerMapper.class
saihadoopboyer/BoyerMooreImpl.class
.project

我运行的代码如下所示:

hduser@Ganesh:~/Documents$ hadoop jar saihadoopboyer.jar saihadoopboyer.BooyerMooreImpl Behara/saihadoop/input Behara/saihadoop/output

我得到以下错误:

Exception in thread "main" java.lang.ClassNotFoundException: saihadoopboyer.BooyerMooreImpl
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:278)
    at org.apache.hadoop.util.RunJar.run(RunJar.java:214)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:136)

我正在eclipse中创建一个jar文件。提前感谢所有帮助我的人:):)

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题