맵리듀스 : 여러 노드에 태스크를 분배하는 방법
맵단계와 리듀스단계가 있음 (각 단계는 입력과 출력으로 키-값의 쌍을 가짐)
1. 맵단계, 리듀스단계
데이터는 키-값 쌍으로 변환괴어 맵함수에 입력됨
맵 함수의 출력 = 리듀스 함수의 입력
2. 맵리듀스 소스코드!
1) 맵 함수
맵 함수는 추상map() 메서드를 정의하는 Mappper클래스로 구현됨
Mapper 클래스는 제네릭 타입, 네개의 정규타입 매개변수를 가짐 ( 입력키, 입력값, 출력키, 출력값)
2) 리듀스 함수
리듀스 함수는 Reducer를 사용하여 정의 (맵 함수와 비슷)
3) 잡
job 객체는 잡 명세서(잡 수행하는 방법 정의한 것)를 작성함
하둡 클러스터에서 잡을 실행하는 단계:
1. 코드를 JAR파일로 묶기
- 하둡은 클러스터의 해당 머신에 JAR파일을 배포
2. Job 객체 생성시 입력과 출력 경로를 지정
- 입력경로 지정시 FileInputFormat-addInputPath()호출하여 지정
- 출력경로 지정시 FileInputFormat-setOutputPath()호출하여 지정
(리듀스 함수가 출력파일 저장할 디렉터리)
3. 입출력 데이터 타입 지정
- setMapperclass(), setReducerClass() 메서드 사용
4. 맵리듀스 함수를 정의한 클래스 지정
- waitForCompletion() 메서드 : 잡 제출 후 잡이 모두 끝날 때까지 기다림
3. 시스템 속 맵리듀스
1) 맵리듀스 잡
정의 : 맵리듀스 잡은 클라이어트가 수행하는 작업의 기본 단위
입력데이터, 맵리듀스 프로그램, 설정 정보로 구성되어 있음
하둡은 잡을 맵 태스크, 리듀스 태스크로 나누어 실행
(각 태스크는 YARN을 이용하여 스케줄링, 여러노드에서 실행됨, 실패시 재할당&실행)
2) 입력 스플릿(스플릿)
하둡에서 잡을 입력하기위해 스플릿이라는 고정크기 조각으로 분리 (보통 스플릿 기본크기는 128 MB)
각 스플릿마다 하나의 맵태스크를 생성, 스플릿의 각 레코드를 사용자 정의 맵 함수로 처리함
3) 데이터 흐름 - 맵
- a : 동일 노드에 가용슬록이 있는 경우
HDFS내의 입력 데이터가 있는 노드에서 맵태스크를 실행 (데이터 지역성 최적화)
- b : 동일 노드에 가용슬롯이 없는 경우
잡 스케줄러는 동일 랙에 속한 다른 노드에서 가용 슬롯을 찾음
- c : 동일 랙에 가용슬롯이 없는 경우
외부 랙의 노드 선택 (랙 사이 네트워크 전송 불가피)
4) 데이터 흐름 - 리듀스
맵 태스크의 결과는 로컬디스크에 저장, 리듀스 태스크의 결과는 HDFS에 저장 (다른 복제본은 로컬, 외부 랙에 저장)
위의 그림과 같이 다수의 리듀스 태스크가 있는 경우 리듀스 수만큼 파티션을 생성, 맵의 결과를 각 파티션에 분배함
5) 컴바이너 함수
컴바이너 함수 : 맵과 리듀스 테스크 사이의 데이터 전송을 최소화 하기위한 맵의 결과를 처리하는 함수
컴바이너 함수의 출력 = 리듀스 함수의 입력
(주의! 컴바이너 함수가 리듀스 함수를 완전히 대체할 수 없음! 적용 여부를 검토한 후에 사용해야됨)
'빅데이터 > 하둡' 카테고리의 다른 글
[하둡] 7. YARN- 맵리듀스 1과의 차이 (0) | 2020.07.01 |
---|---|
[하둡] 6. YARN (0) | 2020.06.29 |
[하둡] 5. HDFS (하둡 분산 파일시스템) - 데이터 흐름 (1) | 2020.06.19 |
[하둡] 3. HDFS (하둡 분산 파일시스템) - 설계 및 개념 (0) | 2020.06.19 |
[하둡] 1. 하둡 (1) | 2020.05.25 |