1. 개념
- 맵 : 한줄씩 읽어서 데이터를 변형 하기
(k1, v1) -> list(k2,v2)
- 리듀스 : 맵의 결과 데이터를 집계 하기
(k1, list(v2)) -> (k3, list(k3))
- 따라서 Hive에서 데이터를 조회할 때, 맵퍼는 항상 할당이 되고 리듀서는 Count 등등 집계를 할 때만 할당이 됩니다.
2. 맵 리듀스 아키텍처
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 |