본문 바로가기
공부 및 정리/데이터 엔지니어링

MapReduce

by 스파이펭귄 2024. 3. 6.
728x90

하둡에 내재된 기능으로 JAVA로 구현되어있으며, 빅 데이터를 효율적으로 처리한다. 이러한 MapReduce를 간단히만 살펴보자.

 

하는 일

간단히 얘기하면 데이터를 Mapping하고, 데이터를 Reduce한다.

당연하게도 MappingMapper가 하게 되고, ReduceReducer가 하게 된다.

  • Mapper: 입력 데이터를 특정 로직에 따라서 변형을 가하여 구조화 출력한다.
  • Reducer: 데이터를 집계하는 역할을 한다.

즉, Mapper는 데이터를 변환하고, Reducer는 데이터를 집계하며, 그 결과 데이터는 Key - Value 형태로 나온다. Key는 집계하고자 하는 항목이며, Value는 그 값이다.

 

과정

출처:  http://youtube.com/watch?app=desktop&v=cHGaQz0E7AU

MapReduce의 전체적인 과정은 위와 같다.

  1. 입력 데이터가 Mapper에 들어온다. 이를 여러개의 파티션으로 나눈다. (Split)
  2. Mapper의 출력으로Key: Value 형태로 구조화되어 나온다. 이때 Key는 집계하고자 하는 항목이며, Value는 그 값이다. 이때 Key는 중복된 값을 가지고 나올 수 있다. (이외의 정보는 제거되어 필요한 정보만이 나온다.)
  3. Mapper의 출력을 Shuffle & Sort를 사용해 정리한다. 이때 같은 Key 값을 가진 데이터는 하나의 key로 합쳐지고, key 값으로 정렬된다.
    예를 들어 Mapper의 출력이 다음과 같다고 하자. {166: 359 185: 213 1: 12 166: 12 185: 33}
    Shuffle & Sort를 거치고 나면 다음과 같다. {1: [12] 166: [359, 12] 185: [213, 33]}
  4. Reducer는 정렬된 결과를 받고, 집계 함수로 처리한다.
    위 예시에서 Count 집계 함수 처리를 한다면, 다음과 같다.
    {1: 1 166: 2 185: 2}

Map Reduce 이렇게 간단한 Mapper와 Reducer로 구성되었으며, 이를 활용해 무궁무진하게 확장 가능하다.

 

MapReduce의 분산 처리 방법

MapReduce를 좀 더 자세히 살펴보기 위해 MapReduce의 분산 처리 방법에 대해서 알아보자.

  1. 입력으로 들어온 데이터를 특정 크기의 줄로 나누어 파티션을 생성한다.
  2. 각 파티션을 여러 노드에 분배한다. 이때 각 노드는 독립된 PC이다.
  3. 각 노드는 각 입력을 Mapping한다. 이때 작업은 다른 Line의 영향을 받지 않는 작업이기에 분산 처리가 충분히 가능하다.
  4. 각 노드에서 나온 결과를 모아서 Shuffle & Sort로 정렬 및 처리해 키로 정렬하고 같은 키인 값들을 모아준다. (정렬시 Merge Sort를 사용함)
  5. 이 결과를 다시 여러 파티션으로 나누어 여러 노드에 분배한다.
  6. 각 노드는 Reducing 작업을 진행한다.

 

주의 사항

  • MapReduce는 매우 복잡한 데이터 처리 로직에 대해서는 비효율적이다. line 별로 처리를 하는 방식에 매우 효과가 있지 다른 line에 영향을 받는 처리는 상당히 MapReduce로는 어려울 수 있다.
  • MapReduce는 배치 처리에 최적화 되어 지연시간이 발생해, 실시간 데이터 처리에는 적합한 방식이 아니다. 대신 카프와 같이 메시지 큐 방식을 사용해 모았다가 처리할 수 있긴 하다.

 

Map Reduce라는 기술이 생각보다 간단해서 언젠가 들은 “위대한 것들은 보통 간단하며 엄청나게 확장 가능한 것이다”라는 말이 생각나는 밤이다.

 

Reference

728x90