HADOOP word count example (ver.2 for hadoop ver.2.x)
이제 하둡을 이용한 간단한 예제문을 실행시켜 볼 차례입니다.
먼저 모든 노드를 활성화 시켜줍니다.
$ start-all.sh
$ gedit test.txt &
gedit을 열어서 test.txt 파일을 만들어준 후.... 여기선 단어를 세어주는 프로그램 테스트이므로 문장을 작성해 봅니다.
$ hdfs dfs -put test.txt /input
HDFS(Hadoop Distributed File System)에 input 폴더를 만들고 그안에 위에서 작성한 test파일을 넣어줍니다.
이제 Map과 Reduce job을 위한 Java코드를 작성해 봅니다.
<JAVA Source Code>
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 WordCount { public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{ private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(Object key, Text value, Context context ) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } } public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values, Context context ) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "word count"); job.setJarByClass(WordCount.class); job.setMapperClass(TokenizerMapper.class); job.setCombinerClass(IntSumReducer.class); job.setReducerClass(IntSumReducer.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); } }
위의 코드를 테스트 해보고 싶으시다면... 복사해서 붙여넣어주세요.
$ gedit WordCount.java & // 후에 복사하신 내용을 붙여넣고 저장.
이제 컴파일해 줍니다.
$ hadoop com.sun.tools.javac.Main WordCount.java
jar 파일을 생성해야 겠죠?
$ jar -cf wc.jar WordCount*.class
이제 하둡을 이용해서 맵 리듀스를 해봅니다.
$ hadoop jar wc.jar WordCount /input /output //여기서 한가지 이미 output 폴더가 존재한다면 실행이 되지 않네요.
맵과 리듀스가 완료되었을 것입니다. 그럼 결과를 확인....
$ hdfs dfs -cat /output/part-r-00000
결과를 읽어옵니다. 오늘은 간단히 여기까지만 하고 이후에 스크린샷을 아래에 추가해서 보다 알아보기 쉽게 만들예정입니다.
이후의 내용은 위의 예제를 조금 바꾸어서 두개의 단어가 Pair key 값이 되도록 하여 그 페어키값을 카운트해 볼 생각입니다.