introduce of hadoop map reduce
DESCRIPTION
this document isTRANSCRIPT
Hadoop MapReduce
BigO 스터디 그룹신대용
맵리듀스• 함수 언어에서 사용되던 것에서 유래 • Hadoop 에서 제공하는 프로그래밍 모델
• Map – 데이터에서 Key,Value 를 선출
• Reduce– Key 가 unique 해질 때 까지 Value 들을 정제
기상 데이터 예제• NCDC 의 1901~2001 년 기상 데이터
• 0067011990999991950051507004...9999999N9+00001+99999999999...
• 0043011990999991950051512004...9999999N9+00221+99999999999...
• 0043011990999991950051518004...9999999N9-00111+99999999999...
AWK 처리#!/usr/bin/env bashfor year in all/*do echo -ne `basename $year .gz`"\t" gunzip -c $year | \ awk '{ temp = substr($0, 88, 5) + 0; q = substr($0, 93, 1); if (temp !=9999 && q ~ /[01459]/ && temp > max) max = temp } END { print max }'Done
툴 항목 비고
AWK 42 분 1core 사용
MapReduce 6 분 8core 사용on a 10-node EC2 cluster running High-CPU Extra Large Instances
MapReduce 처리
(0, 0067011990999991950051507004...9999999N9+00001+99999999999...)(106, 0043011990999991950051512004...9999999N9+00221+99999999999...)(212, 0043011990999991950051518004...9999999N9-00111+99999999999...)(318, 0043012650999991949032412004...0500001N9+01111+99999999999...)(424, 0043012650999991949032418004...0500001N9+00781+99999999999...)
(1950, 0)(1950, 22)(1950, −11)(1949, 111)(1949, 78)
(1949, 111)(1950, 22)
Map 함수
Mapper<KEYIN,VALUEIN,KEYOUT,VALUEOUT>
모든 데이터는 Serialize 될 수 있어야 하며 Writeable 을 구현한다 .Writeable 은 DataInput, DataOutput java interface 를
이용한다 .
emit ( key, value)
Reduce 함수
Reduce 는 멱등이어야 한다 .
New API 에서 Iterable 로 변경됨신규 exception
Main
Class 이름으로 현재 ClassPath 에서 jar 를 찾아 cluster 들에 배포
Local, HDFS, S3 등Output 만들어져 있어야 함
Job Running
API 차이점• 추상객체에 기본적으로 구현이 되어 있는 것들을 사용• namespace 이름을 fully 적음 org.apache.hadoop.mapre-
duce 과거 org.apache.hadoop.mapred.• Context 의 역활이 커짐 JobConf, the OutputCollector, and the
Reporter 의 역활 포함• JobConf 의 설정이 통합됨• map, reduce 의 run 메소드 오버라이딩을 통해서 flow control 이
가능 • JobClient->Job• java.lang.InterruptedException 의 추가로 오버라이딩한 메소드의
graceFully 한 종료 가능• reduce 에서 받는 values 가 iterator 에서 iterable 로 바뀌면서 for
(VALUEIN value : values) { ... } 사용 가능
Scale Out
• Job 은 사용자가 이루기 원하는 작업– data,configuration, program 으로 구성됨–map task, reduce task 로 나뉨
• Input 은 고정 크기의 split 으로 나뉨– Split 은 HDFS 의 block size(64MB)– 각 Map task 는 우선적으로 split 이 위치한
곳에서 수행됨 data locality optimazation
• Jobtracker 는 Tasktracker 를 스케쥴링• tasktracker 는 task 들을 수행
Data Flow
Figure 6-1. How Hadoop runs a MapReduce job using the classic framework
Data Flow (cont)
Figure 2-3. MapReduce data flow with a single reduce task
data locality optimization
• Split 이 64MB 이상이면 복수개의 node 에 걸쳐 지게 됨• Map task 는 Map 결과를 local 에 저장
– HDFS 는 비싸며 reducer 전송 성공 후 삭제• Reduce task 는 결과를 HDFS 에 저장
– Local 1 개 , off-rack 2 개
partition
• Reducer 개수는 input 크기에 따라 결정되지 않는다 .
• Reduce task 가 복수개면 map task 는 output 을 partition 으로 나눈다 .– 특정 key 의 연관 데이터는 모두 한 Partition 에
포함 된다 .
Data Flow with partitions
Combiner Functions
• Map 결과 value 들을 정제• Reduce 의 멱등성을 해치거나 reduce 가
결합법칙을 만족해야 하는 경우에는 사용할 수 없다 .–max(0, 20, 10, 25, 15) = max(max(0,
20, 10), max(25, 15)) = max(20, 25) = 25
–mean(mean(0, 20, 10), mean(25, 15)) = mean(10, 20) = 15
Combiner Functions (cont)
• Map node 의 output 이 reduce node 로 보내질 때
• reducer 에서 data 를 shuffle 하는 단계
Hadoop Streaming
• stdio 를 이용하는 map, reduce 를 작성• Hadoop 에서도 실행 가능 하도록 지원함
% cat input/ncdc/sample.txt | ch02/src/main/ruby/max_temperature_map.rb | \sort | ch02/src/main/ruby/max_temperature_reduce.rb
% hadoop jar $HADOOP_INSTALL/contrib/streaming/hadoop-*-streaming.-jar \-input input/ncdc/sample.txt \-output output \-mapper ch02/src/main/ruby/max_temperature_map.rb \-reducer ch02/src/main/ruby/max_temperature_reduce.rb
Hadoop Pipes
• C++ 을 위한 MapReduce interface• tasktracker 와 socket 통신을 한다 . JNI (X) • Data 가 HDFS 에 존재 해야만 한다 .• C++ 과 Java 로직 혼용이 가능 하다 .
Program 내에 reader, writer 가 존재함을 뜻함
“hadoop fs -put [A] [B]” 파일 배치 필요
Streaming, Pipes 내부