Data/MongoDB

[MongoDB] Map-Reduce: 대량 데이터 처리의 유연한 방법

누구세연 2024. 12. 29. 19:11

이번 글에서는 MongoDB Map-Reduce 방식에 대해 알아보겠습니다.👀

 

Map-Reduce란?

Map-Reduce는 대량의 데이터를 병렬로 처리하고 요약하는 데 사용하는 데이터 처리 방식입니다.

MongoDB에서 Map-Reduce는 데이터를 그룹화하거나 집계하는데 활용되며, JavaScript 함수를 사용해 데이터를 변환(map)하고, 결과를 결합(reduce)하여 최종 결과를 생성합니다.

Map-Reduce의 기본 구조

Map-Reduce는 크게 두 단계로 구성됩니다.

  1. Map 단계
    데이터를 특정 키와 값으로 매핑합니다. 각 문서가 처리되어 키-값 쌍이 생성됩니다.
  2. Reduce 단계
    Map 단계에서 생성된 데이터를 키별로 그룹화하고 요약 작업을 수행합니다.

간단한 Map-Reduce 예제

아래 예제는 MongoDB에서 Map-Reduce를 사용해 고객별 총 구매 금액을 계산하는 코드입니다.

db.orders.mapReduce(
  function () {
    // Map 단계: 고객 ID와 금액을 매핑
    emit(this.customerId, this.amount);
  },
  function (key, values) {
    // Reduce 단계: 금액을 합산
    return Array.sum(values);
  },
  {
    out: "total_sales", // 결과를 저장할 컬렉션
  }
);

// 결과 조회
db.total_sales.find();
  • `emit(key, value)`: 각 문서에서 추출한 데이터를 키-값 쌍으로 출력합니다.
  • `Array.sum(values)`: Reduce 단계에서 값들의 합계를 계산합니다.

 

Map-Reduce 특징

  • 유연성
    JavaScript 함수를 사용해 복잡한 연산을 구현할 수 있습니다.
  • 확장성
    대량의 데이터를 처리할 수 있으며, 대규모 클러스터에서도 효과적으로 동작합니다.

 

Map-Reduce의 장점과 단점

장점

  1. 복잡한 데이터 변환 및 처리 로직을 구현할 수 있습니다.
  2. 병렬 처리를 통해 대용량 데이터에 대한 분석이 가능합니다.

단점

  1. 성능: Aggregation Framework에 비해 느릴 수 있습니다. 특히, 작은 데이터셋에서는 비효율적입니다.
  2. JavaScript 엔진 의존: JavaScript로 작성된 함수를 실행해야 하므로 서버 리소스가 더 많이 소모됩니다.
  3. 단순 작업에는 과도한 사용: Aggregation Pipeline으로 충분히 처리 가능한 작업에 비해 복잡도가 높습니다.

 

Map-Reduce와 Aggregation Framework 비교

특징 Aggregation Framework Map-Reduce
사용 편의성 직관적인 단계 기반 처리 JavaScript 함수 필요
성능 빠르고 효율적 상대적으로 느림
복잡한 연산 제한적 JavaScript로 자유롭게 구현 가능
병렬 처리 기본 지원 병렬 처리 가능
사용 사례 필터링, 정렬, 간단한 집계 복잡한 데이터 변환 및 대용량 데이터 분석

 

 

Map-Reduce가 적합한 사용 사례

  1. 복잡한 데이터 처리
    단일 Pipeline 단계로 처리하기 어려운 복잡한 연산이 필요한 경우.
  2. 비정형 데이터 변환
    다양한 형식의 데이터를 자유롭게 변환해야 할 때.
  3. 대용량 데이터 분석
    분산 환경에서 대량의 데이터를 분석해야 할 때.

 

Map-Reduce를 대체할 수 있는 방법

최근 MongoDB에서는 성능 및 사용 편의성을 이유로 Aggregation Framework 사용을 권장하고 있습니다.
하지만 여전히 Aggregation Framework로 처리하기 힘든 복잡한 작업에서는 Map-Reduce를 활용할 수 있습니다.

 

 

💡 Map-Reduce는 Aggregation Framework보다 유연하지만, 더 느리고 복잡한 작업에 적합합니다.
복잡한 데이터 처리 로직이 필요하지 않다면 Aggregation Framework를 우선적으로 고려하는 것이 좋습니다.