ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [개념 정리] 하둡 MapReduce 이해 (1)
    Big Data/Hadoop 2022. 5. 20. 01:49
    728x90

    Keyword : MapReduce, InputSplits, Mapper, Combiner, Partitioner, Shuffling&sorting, Reducer

    개인적인 공부를 위해 강의를 정리한 내용입니다. 이번 글에 포함되어 있는 많은 이미지 또한 해당 강의에서 발췌했습니다.
    하둡을 처음 공부하시는 분들은 강의 시청을 추천드립니다.

     

     

    MapReduce란 무엇인가?

    2004년 구글에서 논문으로 발표했으며, Large Cluster에서 Data processing을 하기 위한 알고리즘입니다. Hadoop MapReduce는 이러한 구글 알고리즘을 소프트웨어 프레임워크로 구현한 구현체입니다. Key-Value 구조가 이 알고리즘의 핵심이며, 데이터의 분산 처리가 가능한 연산에 적합합니다.

     

     

    MapReduce 알고리즘

    HDFS에 분산 저장되어 있는 데이터를 병렬로 처리하여 취합하는 역할을 합니다. Map Function과 Reduce Function으로 구성되어 있으며, Java, C++, Python 등 다양한 프로그래밍 언어를 지원합니다. Job에 대한 구동 및 관리는 하둡이 스스로 처리해 개발자는 비즈니스 로직을 구현하는 데 집중할 수 있게 해 줍니다.

     

     

    MapReduce 장/단점

    장점

    - 단순하고 사용이 편리
    - 특정 데이터 모델이나 스키마, 질의에 의존적이지 않은 유연성
    - 저장 구조의 독립성
    - 데이터 복제에 기반한 내구성과 재수행을 통한 내고장성 확보
    - 높은 확장성

    단점

    - 고정된 단일 데이터 흐름
    - 기존 DBMS보다 불편한 스키마 질의
    - 단순한 스케줄링
    - 작은 데이터를 저장/처리하기에 적합하지 않음
    - 개발도구의 불편함
    - 기술지원의 어려움

     

     

    MapReduce 구동 방식

    - Local : 단일 JVM에서 전체 Job을 실행하는 방식으로, 실제로 이러한 방식으로 많이 사용하지는 않습니다.

    - Classic : Hadoop 버전 1.0대까지 유지하던 MapReduce 분산 처리 방식으로 Job Tracker(1개)와 Task Tracker(여러 개)를 사용하는 MapReduce 버전 1입니다.

    - YARN : Hadoop 버전 2.0 이상에서 사용하는 MapReduce 분산 처리 방식으로 MapReduce 이외의 워크로드 수용이 가능한 MapReduce 버전 2입니다.

     

     

     


    MapReduce 1.0


     

    주요 컴포넌트

    - 클라이언트(Client) : 구현된 맵리듀스 Job을 제출하는 실행 주체

    - 잡트래커(JobTracker) : 맵리듀스 Job이 수행되는 전체 과정을 조정하며, Job에 대한 마스터(Master) 역할 수행

    - 태스크트래커(TaskTracker) : Job에 대한 분할된 Task를 수행하며, 실질적인 Data Processing의 주체

    - 하둡분산파일시스템(HDFS) : 각 단계들 간의 Data와 처리과정에서 발생하는 중간 파일들을 공유하기 위해 사용

     

     

    InputSplits

    출처 : https://data-flair.training/blogs/mapreduce-inputsplit-vs-block-hadoop/

     

    물리적 Block들을 논리적으로 그룹핑 한 개념입니다. InputSplit은 Mapper의 입력 데이터를 분할하는 방식을 제공하기 위해, 데이터 위치와 읽어 들이는 길이를 정의합니다.

     

     

    MapReduce 구동 절차

    클라이언트에서 애플리케이션을 하나 만들어 Job을 실행(1:run job)하면, 신규 job ID를 JobTracker에 할당하고(2:get new job ID), Job Resource를 HDFS에 공유(3:copy job resources)합니다. 이후 JobClient가 JobTracker에게 Job을 제출(4:submit job)하고, 제출을 받은 후 배포 및 구동 과정은 하둡이 자동으로 처리합니다. 단, 이는 Java로 어플리케이션을 만들었을 때의 경우이며, Python은 배포와 같은 추가 과정이 필요합니다. JobTracker는 Job을 초기화(5:initialize job) 하고 HDFS에서 InputSplits 정보를 검색(6:retrieve input splits)합니다. 이후 여유가 있는 TaskTracker에 Task를 할당(7:heartbeat, return task)하고, 공유되어 있는 job resource를 TaskTracker의 local로 복사(8:retrieve job resources)합니다. TaskTracker가 child JVM을 실행(9:launch)하고, MapTask 또는 ReduceTask를 실행(10:run)합니다.

     

     

    MapReduce 데이터 처리 흐름

    Map Task는 local 디스크에서 제일 처음 뜨는 task입니다. Split 되어 있는 데이터를 읽은 후 맵리듀스 알고리즘 기준에 맞게 처리하여 결과를 출력합니다. 그 결과를 partitioning 해준 뒤 파티션 기준으로 같은 key를 갖고 있는 데이터끼리 모아서 merge 작업을 해줍니다. 그 뒤 이를 reduce 작업을 진행해 최종 output을 얻습니다. 실제 예제를 아래에서 살펴보겠습니다.

     

     

    MapReduce 예제

     

    제일 위에 있는 파일을 굉장히 큰 텍스트 파일(100GB)이라고 하고, 이 파일을 하둡에 저장하면 128MB씩 나누어져 블록 단위로 저장이 됩니다. 작성한 애플리케이션이 각 단어가 파일 내에 몇 개씩 존재하는지 counting 한다고 가정하겠습니다. 이때 맵테스크에서 (Andy, 1) (Hi, 1)과 같이 파일을 읽어 key-value 형태로 저장합니다. 취합을 할 때 같은 key를 가지고 있는 데이터들끼리 모으는 과정을 거칩니다. 그 후 reduce에서 각 key가 몇 개 존재하는지 counting 하게 됩니다. 

     

     

    맵리듀스 구현을 위한 인터페이스

    읽어 들이는 데이터 포맷에 따라 InputFormat이 달라지고, Mapper는 비즈니스 로직을 key-value 형태로 만들어주는 부분입니다. Mapper의 결과를 파티셔닝 해주는 Partitioner가 있는데, key를 기준으로 서로 다른 노드에서 나온 key들을 묶어주는 역할을 합니다. Shuffle/sort는 데이터를 섞고, sorting 하는 과정을 거치는데 이 부분에서 트래픽이 발생하게 됩니다. 맵리듀스 동작 시 셔플 과정에서 발생할 수 있는 트래픽을 최소한으로 줄여주어야 성능이 좋아집니다. 이러한 역할을 하는 것이 Combiner와 partitioner입니다.

     

    RecordReader의 역할

    실제 파일에 접근하여 데이터를 읽는 부분으로, 읽은 데이터를 key-value 형태로 반환해 mapper에게 전달합니다.

     

    Mapper의 역할

    맵리듀스 프로그램에서 사용자의 비즈니스 로직이 구현되는 첫 번째 데이터 처리 구간으로, Intermediate 결과 파일을 로컬 디스크에 Key-Value pair로 Partition 정보를 포함하여 생성합니다.

     

    Combiner의 역할

    데이터 전송량을 줄이기 위해서, Reducer에 보내기 전에 reduce 작업을 미리 하여 트래픽을 감소해주는 부분입니다. 이 부분은 성능에 많은 영향을 끼치게 됩니다.

     

    Partitioner의 역할

    기본 파티셔너는 데이터의 key값을 해싱 처리하고 reducer의 개수만큼 모듈러 연산을 처리합니다. 같은 key를 가지는 데이터끼리 모이게 됩니다.

     

    Shuffling & Sorting 과정

    Mapper의 immediate 결과 파일이 Reducer로 전달되는 과정이 shuffling(이때 트래픽 발생)이며 서로 다른 Mapper로부터 받은 데이터를 key 중심으로 sorting을 수행합니다. 이때 같은 key에 해당하는 리스트를 Reducer로 전달하게 됩니다.

     

    Reducer의 역할

    Mapper의 출력 결과를 입력으로 받아서 데이터를 처리하는 과정입니다. 처리된 데이터를 OutputFormat의 형태에 맞게 결과로 출력하며 맵리듀스 애플리케이션에서 Reducer의 구현은 선택적인 옵션입니다.

     

     

    MapReduce 진행 상황과 상태 갱신

    MapReduce 실행 시 Job에 대한 실행 상태를 테스크 트래커가 잡 트래커에게 리포트하게 됩니다. 실행되던 테스크가 수행 중간에 장애가 발생할 수 있고, 이때 잡 트래커는 장애가 난 서버가 처리해야 하는 데이터를 갖고 있는 다른 테스크에게 Job을 다시 실행하게 명령합니다. 그러면 클라이언트는 실제 잡을 실행한 상태에서 특정 서버에 장애가 생기더라도 약간의 시간 지원(delay)가 있을 수 있지만, 일정 시간 이후에는 job이 정상적으로 종료됩니다. 이러한 job에 대한 관리도 하둡 내에서 자동적으로 이루어집니다.

     

    다음 포스트에서 MapReduce 2.0, YARN에 대해서 알아보겠습니다.

     

    728x90

    댓글

Designed by Tistory.