SyntaxHighlighter.all();

맵리듀스 : 여러 노드에 태스크를 분배하는 방법

              맵단계와 리듀스단계가 있음 (각 단계는 입력과 출력으로 키-값의 쌍을 가짐)

 

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), 랙로컬(b), 외부랙(c) 맥 태스크, 하둡완벽가이드

      - a :  동일 노드에 가용슬록이 있는 경우

             HDFS내의 입력 데이터가 있는 노드에서 맵태스크를 실행 (데이터 지역성 최적화)

      - b :  동일 노드에 가용슬롯이 없는 경우

             잡 스케줄러는 동일 랙에 속한 다른 노드에서 가용 슬롯을 찾음

     - c :  동일 랙에 가용슬롯이 없는 경우

             외부 랙의 노드 선택 (랙 사이 네트워크 전송 불가피)

 

4) 데이터 흐름 - 리듀스

    맵 태스크의 결과는 로컬디스크에 저장, 리듀스 태스크의 결과는 HDFS에 저장 (다른 복제본은 로컬, 외부 랙에 저장)

단일 vs 다수 리듀스 태스크, 하둡완벽가이드

 

   위의 그림과 같이 다수의 리듀스 태스크가 있는 경우 리듀스 수만큼 파티션을 생성, 맵의 결과를 각 파티션에 분배함

 

 

5) 컴바이너 함수 

컴바이너 함수 : 맵과 리듀스 테스크 사이의 데이터 전송을 최소화 하기위한 맵의 결과를 처리하는 함수

                      컴바이너 함수의 출력 = 리듀스 함수의 입력

(주의! 컴바이너 함수가 리듀스 함수를 완전히 대체할 수 없음! 적용 여부를 검토한 후에 사용해야됨)

 

 

+ Recent posts