- Java Generic : C++ Template
WordCount 부분에서 메소드를 지정하는데 Treemap<String, Interger> data 부분자세한 내용은 링크를 참조.
C++ Template Library를 다시 보자.
※ 참조 :
1. http://alecture.blogspot.kr/2011/06/generics.html
2. http://arabiannight.tistory.com/entry/%EC%9E%90%EB%B0%94Java-ArrayListT-%EC%A0%9C%EB%84%A4%EB%A6%AD%EC%8A%A4Generics%EB%9E%80
- Hadoop Map&Reduce
1. blocking code(Synchronous) :
코드가 수행되다가 외부 결과 값이 잘못되면 관련된 모든 코드가 실행불가.ex) job.waitForCompletion(true);
2. Non-blocking code :
결과값이 제대로 출력되었는지 지속적으로 호출한다.쓸데없는 호출이 계속되는 문제점이 여전히 존재한다.
3. 비동기(Asynchronous) :
결과값이 제대로 출력되면 그때 값을 리턴해준다.중간 제어를 다른 것들에게 위임하여 행동한다.
1. Message (Windows)but > 우리가 지금까지 짠 코드는 blocking code인데...?
2. Signal (Unix)
3. Interrupt (H/W)
대용량의 파일들을 빌드해보자.
- Make(C/C++)
- ANT(Java)
- Maven(Java) - dependency
-
WordCount.java 내부 코드 보기
===============================================================import java.io.IOException;
import java.util.*;
import org.apache.hadoop.fs.Path;
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.*;
public class WordCount {
public static class MyMapper extends
Mapper<LongWritable, Text, Text, LongWritable> {
private final static LongWritable one = new LongWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line,
"\t\r\n\f |,.()<>");
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken().toLowerCase());
context.write(word, one);
}
}
}
/* Mapper : 파일 내부에 있는 단어들을 카운트한다. */
public static class MyReducer extends
Reducer<Text, LongWritable, Text, LongWritable> {
private LongWritable sumWritable = new LongWritable();
public void reduce(Text key, Iterable<LongWritable> values,
Context context) throws IOException, InterruptedException {
long sum = 0;
for (LongWritable val : values) {
sum += val.get();
}
sumWritable.set(sum);
context.write(key, sumWritable);
}
}
/* Reducer : Mapper에서 카운트한 단어들을 모아서 합산한다. */
/* Reducer는 Text key 값으로 같은 텍스트에 대해서 합산한다. */
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();===============================================================
Job job = new Job(conf, "WordCount");
job.setJarByClass(WordCount.class);
job.setMapperClass(MyMapper.class);
job.setReducerClass(MyReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.waitForCompletion(true);
}
}
추가해야 될 내용
- StringTokenizer tokenizer = new StringTokenizer(line,"\t\r\n\f |,.()<>");
> 'Hello'와 'Hello!'가 다른 단어가 된다.
> token을 추가
- 한글 '조사' 처리 문제
> '부스러기가' 와 '부스러기와'는 서로 다른 단어가 된다.
> 형태소 분석기가 필요
- Mapper Class
※참조 : p. 112 ~136, p. 143
댓글 없음:
댓글 쓰기