2장 맵리듀스
이 프레임웍은?
MapReduce는 구글에서 개발한 소프트웨어 프레임워크(방법론)이다.
who 구글이
what 페타바이트 이상의 대용량 데이터를(기가<테라<페타... 꺄악)
where 신뢰 할 수 없는 컴퓨터로 구성된 클러스터 환경에서
why 병렬처리를 지원하기 위해서
개발되었다.
=> "맵리듀스는 데용량 데이터를 빠르고 안전하게 처리하기 위해서 기존 하드웨어를 활용한 분산 프로그래밍 모델입니다"
이 프레임웍은 함수형 프로그래밍에서 일반적으로 사용되는 Map과 Reduce라는 함수 기반으로 주로 구성되며
c++, c#, 자바, 펄, 파이썬, PHP, 루비 등의 언어로 구현된 라이브러리들이 있다.


문제점
- 동일한 크기로 잡을 나누는 것이 항상 명백하게 되지는 않는다.
파일크기가 일반적으로 다양하기 때문에 몇몇 프로세스들은 다른 것들보다 훨씬 먼저 끝날것이다.
결국 전체 수행결과는 가장 긴 파일에 의해 좌우 될것이다.
(**대안은 입력 파일들을 고정크기의 데이터 청크 들로 나우고 프로세스별로 각 덩어리를 할당하는 방식)
- 독립적인 프로세스로부터 결과를 조합하는데 더 많은 처리가 필요할 수 있다.
각 결과는 다른 각각의 결과와는 무관하기 때문에 모든 결과를 갖다 붙이고 정렬함으로써 조합될수 있다.
- 실제로 데이터와 CPU의 수에 따라 제한될 가능성
처리할수 있는 최적의 수행시간의 제한, 단일 서버의 용량 등
맵
input : 원본데이터
output : 키/값
마스터 노드는 입력 데이터를 받아 그것을 더 작은 단위로 분할하여 여러 워커 노드들에게 분산한다.
작업을 할당 받은 워커 노드들은 해당 데이터들을 더 작은 단위로 분할하여 다른 워커 노드에 배치하는 멀티레벨 트리 구조로
배치할 수도 있다.
결과적으로 워커 노드가 작은 단위로 분할된 데이터를 처리하고 나면 그 결과를 마스터 노드에게 알려준다.

리듀스
input : 맵에서 추출한 키/값
output : 그룹화및 연산수행하여 최종 결과값
마스터 노드는 작은 단위의 문제로 쪼게진 Map의 결과를 결합(combine)하고 수집(collect)하여
우리가 원하는 어떤 output을 만들어낸다.

특징
맵리듀스의 특징은 맵과 리듀스의 각 단계에서 병렬 처리가 가능 한 것이며. 각 맵의 처리 과정은 다른 맵의 처리과정과 완전 독립적이고 이론적으로 모든 병렬을 실행 할 수 있다.
잡의 순서
- 인풋 리더(Input reader)
- 맵 함수(Map function)
- 파티션 함수(partition function)
- 비교 함수(compare function)
- 리듀스 함수9Reduce function)
- 아웃풋 라이터(output writer)
인풋 리더(Input reader)
- 적절하게 지정된 사이즈로 데이터를 분할한다. (일반적으로 16mb ~ 128mb)
분할된 데이터는 프레임웍에 의하여 각 Map 함수단으로 넘어가게 된다.
input 리더는 key, value 페어의 데이터를 읽을 수 있다
맵 함수(Map function)
- 각 맵함수는 key / value 페어 데이터들을 받아 지정된 함수로 처리하고 결과를 리턴한다.
ex)(감자, 1), (고양이,2), (호랑이,1) 등을 각각 리턴하게 된다.
위와같은 과정에서 key가 단어로 value가 해당 문서에서 단어 출현 횟수로 변경된다.
파티션 함수(Parition function)
- 맵함수의 결과가 리듀스 함수로 정리되어 넘어가게 해주는 역할을 하는 함수이며 Sharding을 목적으로 한다.
파티션 함수는 주어진 key를 지정된 리듀스 개수 만큼 분배하게 된다.
우리는 리듀스 머신 개수를 2개로 가정했다고 하자. 그럼 지정된 방법으로 파티션함수는 key의 값을
분석하여 % 2 (리듀스 머신 개수) 각 reduce 함수에게 처리될 결과들을 전달한다.
(일반적으로 key값을 해시하여 모드연산을 취한다)
비교 함수(Comparison fuction)
- 해당과정에서는 지정된 방법에 따라 결과들을 정렬한다. 해당 과정을 세부분화하면, data의 reduce상에서의 순서,
그룹되는 단위 지정들을 할 수 있다. (일반적인 상황에선 신경을 덜 써도 무관할 것이라고 생각된다)
리듀스 함수(Reduce function)
- 맵함수의 결과는 각 키로 정렬되어 reduce 함수에서 수행되게 된다.
해당 결과는 0개나 그이상의 결과로 출력될 수 있으며 해당 과정은 머신 단위로 병렬이고
각 머신당 reduce 함수는 순차적으로 호출된다.
아웃풋 라이터(Output writer)
- 최종적으로 리듀스 함수의 결과를 아웃풋 라이터가 분산 파일 시스템에 저장하게 된다.
map 과정은 주어진 데이터를 key로 분리하여 reduce 단으로 넘기고
key로 분리된 데이터를 정렬, 그룹화하여 reduce 단에선 해당 그룹에 대한 일관적인 처리를 하게 된다.

기능
: 카운터는 잡에 대한 통계를 수집하는 유용한 채널로서 품질 통제, 또는 응용프로그램 수준 통계를 제공한다.
카운터는 문제 진단에 유용하다.
: 데이터를 정렬하는 기능이 바로 맵리듀스의 핵심이다.
응용프로그램이 정렬과 굳이 관련이 없을지라도 데이터를 정리하기 위해서 맵리듀스가 제공하는 정렬 과정을 사용할 수도 있다.
- 조인
: 조인을 구현하는 방법은 데이터셋이 얼마나 큰지 그리고 데이터가 어떻게 파티션 되었는지에 달렸다.
참고::
http://sead.tistory.com/m/564