복붙노트

[HADOOP] 어떻게 하둡와 문자열 매칭 알고리즘을 구현하는 방법?

HADOOP

어떻게 하둡와 문자열 매칭 알고리즘을 구현하는 방법?

나는 하둡을 사용하여 문자열 매칭 (보이어 - 무어) 알고리즘을 구현하고자합니다. 난 그냥 어떻게 자바에서 하둡 프로그램을 작성하는 방법 아무 생각이 그래서 하둡을 사용하기 시작했습니다.

내가 지금까지 본 모든 샘플 프로그램은 워드 카운트 예 내가 문자열 일치에 대한 샘플 프로그램을 찾을 수 없습니다.

나는 자바를 사용 하둡 응용 프로그램을 작성할 수 있지만를 찾을 수있는 방법을 가르치는 몇 가지 튜토리얼을 검색했습니다. 당신은 내게 내가 자바를 사용 하둡 응용 프로그램을 작성하는 방법을 배울 수있는 튜토리얼을 제안 할 수 있습니다.

미리 감사드립니다.

해결법

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

    1.나는 아래의 코드를 테스트하지 않았습니다, 그러나 당신은 시작한다. 여기 사용할 수있는 BoyerMoore 구현을 사용했다

    나는 아래의 코드를 테스트하지 않았습니다, 그러나 당신은 시작한다. 여기 사용할 수있는 BoyerMoore 구현을 사용했다

    아래의 코드는 무엇을하고 :

    목표는 입력 문서에서 패턴을 검색하는 것입니다. BoyerMoore 클래스 구성에 설정된 패턴을 이용하여 초기화 방법으로 초기화된다.

    맵퍼는 한번에 각 라인을 수신하고, 그 패턴을 찾는 BoyerMoore 인스턴스를 사용한다. 일치하는 항목이 발견되면, 우리는 컨텍스트를 사용하여 작성합니다.

    여기 감속기의 필요가 없습니다. 패턴이 다른 매퍼에서 여러 번 발견되었을 경우, 출력은 여러 오프셋 (매퍼 당 1)가됩니다.

    package hadoop.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","your_pattern_here");
            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);
          }
    }
    
  2. ==============================

    2.이 병렬 알고리즘을 실행할 수있는 올바른 구현 경우 나도 몰라,하지만 내가 알아 낸 것입니다,

    이 병렬 알고리즘을 실행할 수있는 올바른 구현 경우 나도 몰라,하지만 내가 알아 낸 것입니다,

    import java.io.IOException;
    import java.util.*;
    
    import org.apache.hadoop.conf.*;
    import org.apache.hadoop.fs.*;
    import org.apache.hadoop.conf.*;
    import org.apache.hadoop.io.*;
    import org.apache.hadoop.mapreduce.*;
    import org.apache.hadoop.mapreduce.lib.input.*;
    import org.apache.hadoop.mapreduce.lib.output.*;
    import org.apache.hadoop.util.*;
    
    public class StringMatching extends Configured implements Tool {
    
      public static void main(String args[]) throws Exception {
          long start = System.currentTimeMillis();
          int res = ToolRunner.run(new StringMatching(), args);
          long end = System.currentTimeMillis();
          System.exit((int)(end-start));
      }
    
      public int run(String[] args) throws Exception {
        Path inputPath = new Path(args[0]);
        Path outputPath = new Path(args[1]);
    
        Configuration conf = getConf();
        Job job = new Job(conf, this.getClass().toString());
    
        FileInputFormat.setInputPaths(job, inputPath);
        FileOutputFormat.setOutputPath(job, outputPath);
    
        job.setJobName("StringMatching");
        job.setJarByClass(StringMatching.class);
        job.setInputFormatClass(TextInputFormat.class);
        job.setOutputFormatClass(TextOutputFormat.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
    
        job.setMapperClass(Map.class);
        job.setCombinerClass(Reduce.class);
        job.setReducerClass(Reduce.class);
    
        return job.waitForCompletion(true) ? 0 : 1;
      }
    
      public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();
    
        @Override
        public void map(LongWritable key, Text value,
                        Mapper.Context context) throws IOException, InterruptedException {
          String line = value.toString();
          StringTokenizer tokenizer = new StringTokenizer(line);
          while (tokenizer.hasMoreTokens()) {
            word.set(tokenizer.nextToken());
            context.write(word, one);
          }
        }
      }
    
      public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
    
        @Override
        public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            BoyerMoore bm = new BoyerMoore(); 
            boolean flag = bm.findPattern(key.toString().trim().toLowerCase(), "abc");
            if(flag){
                context.write(key, new IntWritable(1));
            }else{
                context.write(key, new IntWritable(0));
            }
        }
      }
    
    }
    

    나는 AWS (아마존 웹 서비스)를 사용하고 그래서 내가 내 프로그램을 동시에 실행할하려는 콘솔에서 노드의 수를 선택할 수 있습니다. 그래서지도와 내가 병렬로 보이어 - 무어 문자열 매칭 알고리즘을 실행하기위한 충분해야 사용했던 방법을 줄일 수 있으리라 믿고있어.

  3. from https://stackoverflow.com/questions/33685079/how-to-implement-string-matching-algorithm-with-hadoop by cc-by-sa and MIT license