[Hadoop] 하둡 맵-리듀스 따라잡기
맵-리듀스! 이녀석을 알아가기 위해 정리를 하나씩 해보려고 한다.
가장 쉬우면서도 어려운 맵-리듀스 소스 짜보기!
1. Maven 설정
|
2. runner : runner는 우선 map, reduce, data format등 그리고 run을 통해 시작 시킬수 있는 친구라고 생각하고 넘어가자.
아래의 소스는 가장 단순한 형태 이다. 보통 책에 나오거나 튜토리얼에 나오는 소스 형태! 중요한 것은 runner보다 map과reduce!
public class MoClickDistributionChartRunner extends Configured implements Tool {
public MoClickDistributionChartRunner() {
}
@Override
public int run(String[] args) throws Exception {
String[] otherArgs = new GenericOptionsParser(getConf(), args).getRemainingArgs();
// 입출력 데이터 경로 확인
if (otherArgs.length != 2) {
System.err.println("Usage: MoClickDistributionChartRunner <in> <out>");
System.exit(2);
}
// Job 이름 설정
Job job = new Job(getConf(), "MoClickDistributionChartJob");
// 입출력 데이터 경로 설정
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
// Job 클래스 설정
job.setJarByClass(MoClickDistributionChartJob.class);
// Mapper 클래스 설정
job.setMapperClass(MoClickDistributionChartMapper.class);
// Reducer 클래스 설정
job.setReducerClass(MoClickDistributionChartReducer.class);
// 입출력 데이터 포맷 설정
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
// 출력키 및 출력값 유형 설정
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.waitForCompletion(true);
return 0;
}
public static void main(String[] args) throws Exception {
long startTime = System.currentTimeMillis();
// Tool 인터페이스 실행
int res = ToolRunner.run(new Configuration(), new MoClickDistributionChartRunner(), args);
System.out.println("## RESULT:" + res);
}
}
3. Mapper
public class MoClickDistributionChartMapper extends
Mapper<LongWritable, Text, Text, Text> {
// 입출력의 데이터포맷을 알수가 있다.
// map 메소드를 통해 수행 되어지며 key, value의 입력값들이 들어오게 된다.
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException { ..블라블라~.. }}- key는 라인을 나타내는 숫자형태이며, value는 Text형태의 값들이 들어온다.
- value값을 가지고 파싱하여 vo에 넣을수도 있으며 원하는 값을 가지고 오기 위해 parsing작업을 한다.
// 원하는 값들을 구하여 아래에 context.write를 해주면 output value로 들어가게 된다. Text, Text형태가 될 것이다. context.write(new Text(moSize), new Text(xyNum + "\t1"));
즉, 코딩에 들어가기전에 map과 reduce의 입력과 출력형태의 key, value를 고려하여야 한다.
4. Reducer :
public class MoClickDistributionChartReducer extends
Reducer<Text, Text, Text, Text> {
protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
작성 중~~