본문 바로가기

Hadoop

맵리듀스

1. 개념

- 맵 : 한줄씩 읽어서 데이터를 변형 하기

(k1, v1) -> list(k2,v2)

- 리듀스 : 맵의 결과 데이터를 집계 하기

(k1, list(v2)) -> (k3, list(k3))

- 따라서 Hive에서 데이터를 조회할 때, 맵퍼는 항상 할당이 되고 리듀서는 Count 등등 집계를 할 때만 할당이 됩니다.

 

2. 맵 리듀스 아키텍처

출처: https://blog.naver.com/PostView.nhn?blogId=goddlaek&logNo=221065584454&categoryNo=59&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=search

1. 클라이언트

- 맵리듀스 API

2. 잡트래커

- 잡의 스케줄링을 관리하고 모니터링

- 잡을 처리하기 위해 몇개의 맵과 리듀서를 실행할지 계산함.

- 계산된 맵과 리듀스를 어떤 태스크트래커에서 실행할지 결정하고, 해당 태스크트래커에 잡을 할당함

3. 태스크트래커

- 사용자가 실행한 맵리듀스 프로그램을 실행하며 , 하둡의 데이터노드에서 실행되는데몬

- 잡트래커가 요청한 맵과 리듀스 개수 만큼 맵태스크와 리듀스 태스크를 생성함

- 맵태스트와 리듀스태스크는 사용자가 설정한 맵 리듀스 프로그램을 의미함. (각 태스크는 생성시 새로운 JVM을 구동, 재사용 설정 가능)

 

3. 데이터 플로우

1. 맵

- 대용량 파일을 처리하기 위해, 입력 데이터 파일을 "입력 스플릿" 이라는 고정된 크기의 조각으로 분리

- 출력데이터는 서버의 로컬 디스크에 저장되며(중간 결괏값이니 HDFS에 굳이 저장할 필요가 없음, 잡이 완료되면 삭제), 출력키를 기준으로 정렬됨

(key1, value1)

2. 셔플

- 리듀서에서 연산을 할 때 파티셔닝

- 파티션은 실행될 리듀스 태스크만큼 생성됨

- 기본 파티셔너는 맵의 출력 레코드를 읽어서 출력키의 해시값을 구해 레코드가 속하는 파티션 번호로 사용됨.

(key1, list(value of key1))

 

3. 리듀스

- 전달할 출력파일을 생성함

- 리듀스 함수를 레코드 단위로 실행, 출력데이터는 출력키와 출력값의 쌍

- HDFS에는 리듀스 개수만큼 출력 파일이 생성되며, 파일명은 part-nnnnn으로 설정, nnnnn은 파티션 번호를 의미하며 00000부터 1씩 증가합니다.

(key1, list(value of key1) 의 계산 결과)

 

4. 맵 리듀스 프로그래밍 요소

1. 매퍼

- 맵 리듀스 프로그래밍 모델에서 맵 메서드의 기능을 수행함

2. 파티셔너

- 맵 태스크의 출력 데이터가 어떤 리듀스 태스크로 전달될지 결정함

- 맵 태스크가 실행된 노드에서 파티션이 생성된 후, 맵 태스크의 출력 데이터가 저장됨

- 모든 맵 태스크의 작업이 완료되면 파티션에 저장된 데이터는 해당 리듀스 태스크로 네트워크를 통해 전송됨

- 파티셔닝의 개념은 디스크를 분할하는것이 아니라, 논리적인 단위로 나누는 것으로 이해했습니다. http://www.dator.co.kr/encore/textyle/205656

3. 리듀서

- 맵 태스크의 출력 데이터를 입력 데이터로 전달받아 집계 연산을 수행함

4. 콤바이너 클래스, 셔플

- 셔플 : 맵태스크와 리듀스 태스크 사이의 데이터 전달 과정, 따라서 셔플이 줄면 잡이 빨라진다

- 콤바이너 클래스 : 셔플할 데이터의 크기를 줄이는데 도움을 줌. 매퍼의 출력 데이터를 입력 데이터로 전달받아 연산을 수행(로컬에서 나온 매퍼의 출력데이터로 연산)

 

 

 

본 게시물은 시작하세요 하둡 프로그래밍 도서를 정리한 문서입니다.

맵리듀스 잡의 실행 단계(클라이언트 JVM ->잡트래커/태스크트래커)는 생략했습니다.

잘못 이해한 개념이 있다면, 피드백 부탁드립니다. 감사합니다.

'Hadoop' 카테고리의 다른 글

HDFS  (0) 2019.11.30
CDH 중 Oozie에서 Permission에러가 나요!  (0) 2019.09.30