2014년 9월 30일 화요일

HDFS 살펴보기 2

  • 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)
2. Signal (Unix)
3. Interrupt (H/W)
  but > 우리가 지금까지 짠 코드는 blocking code인데...?

  대용량의 파일들을 빌드해보자.

  • 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

댓글 없음:

댓글 쓰기