3. 이런 ASCII data를 받아서 처리하려면?
●간단한 프로그램 짜면 되죠
o언어야 뭐든지 상관없고요
o이런 논리로 짜면 되겠죠?
읽는다
필요한 데이터 추출한다
닫는다
위의 과정을 모든 데이터에 대해 반복한다.
4. UNIX도구 이용, 매년 제일 높았던 지구
기온 찾기
awk기반 데이터 분석 스크립트 수행 결과
●모든 데이타 파일을 찾아 읽어서 처리한다
●20세기 데이타 전체 수행하는데 EC2고성능 CPU XL instance
에서 42분 걸렸다
●그런데 이게 최선입니까? 확실해요?
5. 몇가지 개선점을 생각해봅시다
●병렬로 하면 좀 나아지긴 할건데요,
o연도별 파일 크기가 달라져서 동일한 크기로 일을 나누기가
쉽진 않네요
o각각의 프로세스의 처리 결과를 합산하는 시간은 얼마나 또
걸릴까요?
o단일 서버의 처리 능력은 한계가 있어요. 분산해서 처리해
도 이거 관리 하는 일이 복잡하죠
7. Map / Reduce
●크게 Map / Reduce로 단계를 나눠서 처리합니다.
o각 단계는 입력과 출력으로써 Key / Value 쌍을 가지고 있
고, 타입은 프로그래머 마음대로
oMap / Reduce 함수는 프로그래머가 직접 작성합니다
●Map단계
o입력: NDDC 원본 데이터
키: 이 텍스트 파일에서 몇번째 라인인지 나타내는
Offset
값:연도와 기온데이타를 추출
12. 이제 Reduce함수에 맞게 입력데이타를
만듭니다
●Key를 중심으로
●Key / Value 쌍들을 정렬하고 그룹을 만든다.
●그래서 만든 데이타는 이렇게 된다. 이것을 Reduce함수에 집
어 넣습니다.
( 1949, [111, 78]
( 1950, [0, 22, -11] )
........
.......
13. Reduce함수가 하는 일
각 Key안에 있는 list를 sorting합니다.
( 1949, 111 )
( 1950, 22 )
........
.......
14. 딱 보니 Pattern이 보이네요
이런 식으로 정리하는 거죠
1.많은 데이터에서 내가 필요한 데이터가 뭔지 정의하죠
2.이 데이터에서 Key / Value로 데이터를 정리합니다.
1.이 Key는 마지막 단계까지 쓰게 됩니다.
3.정리된 데이터를 정렬합니다.
4.정렬된 데이터를 순환하면서 원하는 데이타를 뽑아낸다.
23. Hadoop적용코드: Hadoop Job code
public class MaxTemperature {
public static void main(String[] args) throws IOException {
if (args.length != 2) {
System.err.println("Usage: MaxTemperature ");
System.exit(-1);
}
24. Hadoop적용코드: Hadoop Job code
JobConf conf = new JobConf(MaxTemperature.class);
conf.setJobName("Max temperature");
FileInputFormat.addInputPath(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
conf.setMapperClass(MaxTemperatureMapper.class);
conf.setReducerClass(MaxTemperatureReducer.class);
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
JobClient.runJob(conf);
}
25. 실제 JAVA code를 읽어보면...
●기본적으로 Hadoop에서 Map함수, Reduce함수는 사용자가
작성하는 거다.
●세가지는 코드를 작성해야 한다.
oMap함수
oReduce함수
o구동 코드
JobConf: 어떻게 Job을 수행할지 결정해주는 객체
hadoop cluster에서는 소스코드를 JAR파일로 묶어야
하고 Hadoop이 Cluster에 JAR를 배치하게 해준다.