[HADOOP] 어떻게 하둡와 문자열 매칭 알고리즘을 구현하는 방법?
HADOOP어떻게 하둡와 문자열 매칭 알고리즘을 구현하는 방법?
나는 하둡을 사용하여 문자열 매칭 (보이어 - 무어) 알고리즘을 구현하고자합니다. 난 그냥 어떻게 자바에서 하둡 프로그램을 작성하는 방법 아무 생각이 그래서 하둡을 사용하기 시작했습니다.
내가 지금까지 본 모든 샘플 프로그램은 워드 카운트 예 내가 문자열 일치에 대한 샘플 프로그램을 찾을 수 없습니다.
나는 자바를 사용 하둡 응용 프로그램을 작성할 수 있지만를 찾을 수있는 방법을 가르치는 몇 가지 튜토리얼을 검색했습니다. 당신은 내게 내가 자바를 사용 하둡 응용 프로그램을 작성하는 방법을 배울 수있는 튜토리얼을 제안 할 수 있습니다.
미리 감사드립니다.
해결법
-
==============================
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.이 병렬 알고리즘을 실행할 수있는 올바른 구현 경우 나도 몰라,하지만 내가 알아 낸 것입니다,
이 병렬 알고리즘을 실행할 수있는 올바른 구현 경우 나도 몰라,하지만 내가 알아 낸 것입니다,
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 (아마존 웹 서비스)를 사용하고 그래서 내가 내 프로그램을 동시에 실행할하려는 콘솔에서 노드의 수를 선택할 수 있습니다. 그래서지도와 내가 병렬로 보이어 - 무어 문자열 매칭 알고리즘을 실행하기위한 충분해야 사용했던 방법을 줄일 수 있으리라 믿고있어.
from https://stackoverflow.com/questions/33685079/how-to-implement-string-matching-algorithm-with-hadoop by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 프로세스 구조화되지 않은 여러 라인 CSV 하둡 (0) | 2019.10.23 |
---|---|
[HADOOP] HDFS에 파일을 복사 할 수 없습니다 (0) | 2019.10.23 |
[HADOOP] 스파크 RDD에서 combineByKey 및 aggregateByKey없이 지정된 출력을 얻는 방법 (0) | 2019.10.23 |
[HADOOP] 맵리 듀스를 사용하여 암호로 보호 된 zip 파일을 처리하면 [복제] (0) | 2019.10.23 |
[HADOOP] MapReduce의 응집 [폐쇄] (0) | 2019.10.23 |