- Map Reduce는 여러대의 일반적인 컴퓨터들을 네트워크로 묶어서 병렬 프로그래밍으로 빅데이터를 처리하는 모델이다.
- single node는 빅데이터 처리에 부적합하다
- 여기서 switch는 네트워크 스위치
- 스위치가 감당해야하는 데이터 흐름이 크기 때문에 '네트워크'에서 문제가 생김
single node로는 더이상 감당할 수 없게 되어 large-scale computing으로 대체
Large-Scale Computing
- 큰 데이터를 감당할 수 없는 네트워크로 인해 'bottle neck'현상이 발생
( 네트워크 COST가 너무 높음 )➡️ computation을 local에서 ( data 가까이에서 ) 처리
: 데이터의 이동을 최소화한다➡️ file REPLICATION
: reliability를 위해 복사본을 만들어 저장Map Reduce로 위의 두가지 실현 가능
- storage infrastructure , Programming model
storage infrastructure - DFS
- Data nodes (chunk servers) , Master node (Name node)
- Data node : workers 데이터들 쪼개고 복제해서 저장
- Master node : 각 데이터들이 어디에 저장되어있는지 관리하는 metadata
- ex. word count를 해야하는 경우
- 어떤 웹사이트가 가장 많이 검색되는 지 등을 파악할 때 자주 사용한다
> 파일 내용 읽기 -> 정렬 -> 중복되는 데이터 제거 ) 각 단계에서 서로 간섭 X
Map Reduce에서 input, output 값은 무조건 key-value pair이다
input : a set of key-value pairs
Map(k,v) → <k',v'>*
*'는 ' 0 이상 ( many ) ' 를 의미한다e.g., (word count 예제에서) key = file name , value = 파일의 각 줄(line)
즉, Mapper에서 key값은 아무런 의미가 없다.
코드
map(key, value): /* key: document name; value: text of the document*/ for each word w in value: emit(w, 1)
: 같은 key값의 value들을 grouping 하는 것
map-> reduce로 데이터가 넘어가는 과정 :
key값은 같은데 reduce 과정을 거치며 value값이 달라진다
Reduce(k',<v'>) → <k',v''>
k'라는 같은 키를 가지는 모든 값들 v'은 reduced together.>
e.g., (word count 예제에서) key = word , value = count
코드
reduce(key, values): /* key: a word; value: an iterator over counts */ result = 0 for each count v in values: result += v emit(key, result) 22
- 각각의 MAP TASK는 독립적으로 작업한다
- 각각의 REDUCE TASK는 독립적으로 작업한다
- 하지만 MAP과 REDUCE 사이에는 dependancy가 있다.
- Mapper의 작업이 모두 끝나야만 Reducer가 작업을 할 수 있기때문이다
- Intermediate result는 왜 HDFS가 아닌 local에 저장하는가?
DATAFLOW 과정
- mapper의 결과를 local에 저장한 뒤 완료사실과 저장된 주소를 namenode에게 알림
- reducer는 그 알림을 보고 mapper가 알린 주소에 접근하여 데이터 fetch해감