Map/Reduce
태그 :
- 개념
- - HDFS에 저장 되어 있는 대용량 데이터를 분석 하려면 분산 환경에서 병렬 처리를 지원하는 프레임워크.. Hadoop MapReduce는 구글에서 사용중인 MapReduce를 기반으로 개발.
I. MapReduce 의 정의
가. MapReduce의 정의
- HDFS에 저장 되어 있는 대용량 데이터를 분석 하려면 분산 환경에서 병렬 처리를 지원하는 프레임워크.. Hadoop MapReduce는 구글에서 사용중인 MapReduce를 기반으로 개발.
II. MapRedcue 시스템 구성
나. 시스템 구성도
구성요소 |
내용 |
잡 트래커 (Job Tracker) |
전체 작업(태스크 트래커들이 수행하는)을 관리하는 마스터역활을 수행하는 서버이며, 주로 하둡 파일 시스템의 네임 노드가 실행되는 서버에서 실행 합니다. |
태스크 트래커(Task Tracker) |
사용자들이 요청한 작업을 수행 하며, 데이터 노드가 실행되는 서버에서 실행 합니다. |
클라이언트 라이브러리(Client Library) |
사용자의 다양한 입력과 분산처리를 사용할 수 있는 메커니즘을 제공하며, 사용자가 개발한 프로그램을 잡 트래커로 작업하도록 요청하고, 작업 결과를 모니터링 할 수 있는 API를 제공합니다 |
보통 하나의 맵리듀스 작업은 n개의 map과 m개의 reduce로 분리되고, 이렇게 분리된 태스크가 태스크 트래커에서 실행을 합니다, 작업의 분리는 클라이언트 라이브러리에 의해 데이터의 입력포맷에 따라 이루어 집니다. (기본적인 입력 포맷은 하둡에서 제공, 사용자 입력 포맷을 정의하는 것도가능)
시스템 구성에 따른 처리흐름 입니다.
↓
① 잡 트래커는 태스크 트래커 별로 처리할 작업 목록을 구성합니다.
↓
② 태스크 트래커는 주기적으로 heartbeat를 전송하고, 잡 트래커는이 메시지의 반환 값에 처리할 작업 ID를 반환 합니다.
↓
③ 작업 ID를 받은 태스크 트래커는 관련된 작업의 정보를 하둡 파일시스템에서 가져오고, 수행할 프로그램도 하둡 파일 시스템으로부터 로컬에 저장합니다.
↓
④ 태스크 트래커에서는 fork 명령을 이용해 맵과 리듀스를 실행합니다.(태스크 트래커는 동시에 태스크를 수행할 수 있으며 , 서버당 몇 개의 태스크를 동시에 수행할 것 인지 환경설정으로 설정 가능합니다.)
만약 태스크 트래커가 문제가 생기거나, 새로운 태스크 트래커가 추가되면 잡 트래커는 자동으로 인식하여 추가 및 제거 작업을 수행합니다. (장애가 발생한 태스크 트래커의 작업은 다른 태스크 트래커에 재할당 되고 작업을 재 시작 합니다.)
하지만 잡 트래커에서 장애가 발생하는 경우 HDFS와 동일하게 현재 수행 중인 작업 모두가 실패 처리 됩니다.
III. MapReduce 함수
- MapReduce는 일종의 함수형 프로그래밍입니다.
- map, reduce라는 합쳐진 용어로, 두 함수의 조합을 통해서 분산/병렬 시스템을 운용을 지원합니다.
- 맵 함수의 입력으로 키(k1), 값(v1)이 전달 되면, 맵 함수는 전달된 키-값을 이용해 사용자의 로직을 처리한 후 출력으로 새로운 키(k2)와 값(v2)의 목록을 출력 합니다. 이 때 키-값이 그대로 출력될 수 있으며, 출력 데이터의 갯수는 0 또는 1개 이상 일 수 있습니다.
- 맵 함수가 반복 적으로 수행 되면 여러 개의 출력 데이터가 생성 되고, 이 출력 데이터를 키로 정렬하면 각 키에 여러 개의 데이터가 존재 합니다. 이 키(k2)와 값 목록(list(v2))이 리듀스 함수로 입력 됩니다.
- 리듀스 함수는 키-값 목록을 파라미터로 받아 사용자의 로직을 처리한 후 여러 개의 값을 출력 합니다.
IV. MapReduce의 사용예제
가. 처리 방식 구성도
[단어 개수를 세는 예제].
1) 맵리듀스 프레임워크는 입력 파일의 값을 라인 단위로 맵 함수에 전달합니다. 키는 해당 라인의번호이고, 값을 해당 라인의 내용입니다.
2) 맵 함수는 공백을 기준으로 문자를 분리 한 후, 단어의 개수인 1을 출력합니다.
3) 맵 함수를 거치면 임시 결과가 출력 됩니다.
4) 출력결과를 키로 정렬 한 후, 각 값을 나열해 목록을 생성합니다.
5) 이렇게 정렬/병합 된 값이 리듀스 함수로 전달 됩니다.
6) 리듀스 함수에서는 키에 단어가 전달되고, 값에 글자수 목록이 전달 됩니다.
7) 리듀스 함수는 값으로 글자수 목록에 반복을 수행 하면서, 합을 계산해 단어와 합을 출력 합니다.
맵리듀스가 분산/병렬 처리하기 좋은 이유는 입력 데이터에 대한 맵 함수는 동시에 독립적으로 병렬 처리할 수 있는 구조 이기 때문 입니다. 위의 예제를 Line 1, 2 를 각각의 서버에서 실행되면 단순 계산상으로 2배의 성능효과를 볼 수 있습니다.
그리고 예제 내용 모두를 사용자가 구현하는 것이 아니라 맵리듀스 프레임워크에서 아래와 같은 사항을 자동으로 처리 해줍니다.
1.입력 파일을 라인단위로 맵 함수에 전달.
2.맵 함수의 출력 결과를 정렬/병합.
3.정렬/병합 된 결과를 리듀스 함수에 전달.
4.맵 함수를 분산된 서버에서 수행.
5.분산
처리된 맵 결과를 리듀스가 수행 될 서버로 전송.
[참고]
병렬처리 방식 개념도
맵 리듀스 체인