맵리듀스(MR)은 대규모 데이터 처리의 핵심 개념 중 하나입니다.

대용량 데이터를 한 대의 컴퓨터에서 처리하는 것이 불가능하거나 매우 비효율적일 때, 분산 시스템을 사용하여 여러 컴퓨터에 작업을 분배하고 처리 후 결과를 합치는 방식이 바로 맵리듀스입니다.

이 방식은 특히 분산 데이터 처리에서 효율적이고, 데이터의 크기가 너무 커서 한 대의 머신에만 의존할 수 없는 경우에 매우 유용합니다.

맵리듀스가 어떻게 동작하는지, 그리고 파일을 중간에 "떨구고" 다시 가져와서 처리하는 과정에 대해 좀 더 자세히 설명드리겠습니다.

맵리듀스(MR)의 기본 개념

맵리듀스는 크게 두 단계로 나뉩니다: Map 단계와 Reduce 단계.

1. Map 단계

  • 맵(MAP) 단계는 데이터를 작은 조각들로 나누어 처리하는 단계입니다.

  • 예를 들어, 큰 파일이 있다고 가정했을 때, 이 파일을 여러 개의 작은 청크(chunk)로 나눠서 여러 작업자(worker)에게 분배합니다.

  • 각 작업자는 자신에게 할당된 데이터에 대해 독립적으로 작업을 합니다.
    예를 들어, 단어 빈도수를 계산하는 경우, 각 작업자는 자신에게 주어진 텍스트에서 단어를 추출하고 그 빈도를 세는 작업을 합니다.

  • 이때 작업자는 보통 파일 시스템(예: HDFS, Amazon S3, HBase 등)에 데이터를 쓰거나 메모리 상에서 데이터를 처리하여 중간 결과를 저장합니다.

중간 결과는 파일로 떨궈져 다른 노드에서 사용할 수 있도록 저장됩니다.

2. Reduce 단계

  • 리듀스(REDUCE) 단계에서는 맵 단계에서 나온 중간 결과들을 취합하여 최종 결과를 만듭니다.

  • 예를 들어, 여러 작업자가 계산한 단어 빈도수를 모아서, 최종적으로 각 단어의 전체 빈도를 계산하는 것입니다.

  • 이때도 여러 작업자들이 병렬로 작업을 할 수 있으며, 최종 결과를 파일 시스템에 저장하거나 다른 시스템에 전달합니다.

맵리듀스의 처리 과정에서 파일을 떨구는 이유

맵리듀스 시스템에서 "파일로 떨구는" 과정은 중간 결과를 디스크에 저장하는 단계입니다.

왜냐하면 한 번에 모든 데이터를 메모리에서 처리하기 어렵기 때문에, 각 Task에서 나온 결과를 디스크에 기록하고, 필요한 작업을 이어서 진행하기 위해서입니다.

중간 결과 파일을 생성하는 이유

1. 메모리 한계: 데이터가 너무 크면 한 대의 컴퓨터의 메모리만으로 처리하기 어려워지기 때문에, 중간 결과를 디스크에 기록하여 메모리 사용을 최소화합니다.

2. 병렬 처리: 여러 컴퓨터에서 분산 처리하면서 각 컴퓨터의 메모리에 올려서 작업할 수 있는 데이터의 크기는 제한적입니다.
그래서 작업 단위로 데이터를 나누어 디스크에 기록하고, 각 작업자가 이를 읽어 처리합니다.

3. 내결함성(fault tolerance): 중간 결과를 디스크에 저장함으로써 작업 중 장애가 발생해도 다시 작업을 재시작할 수 있습니다.

예를 들어, Map 작업에서 처리된 데이터를 중간에 디스크에 저장하면, 실패가 발생해도 해당 데이터를 재사용할 수 있습니다.

맵리듀스의 처리 흐름 예시 (단어 빈도수 계산)

맵리듀스의 예시로 단어 빈도수 계산을 살펴보겠습니다.

1. 입력 데이터

  • 대용량 텍스트 파일이 있다고 가정합니다.
    예를 들어, "data.txt"라는 파일에 수백 기가바이트의 텍스트 데이터가 저장되어 있습니다.

2. Map 단계

텍스트 파일을 여러 개의 작은 청크로 나눠서 여러 맵 작업자에게 전달합니다.

각 맵 작업자는 할당된 청크에서 단어를 분리하고 각 단어가 몇 번 나왔는지를 계산합니다.

예를 들어, "hello"라는 단어가 5번, "world"라는 단어가 3번 나왔다면, 이를 (단어, 빈도) 쌍으로 기록합니다.

중간 결과를 디스크에 떨궈 두고, 여러 작업자가 병렬로 작업을 진행합니다.

중간 결과 예시

(hello, 5)
(world, 3)
(hello, 2)
(python, 7)

3. Shuffle & Sort 단계

  • 이 단계에서는 Map 작업에서 생성된 중간 결과들을 모은 후, key를 기준으로 정렬하고 같은 key에 대해 값을 합칩니다.
    예를 들어, "hello"라는 단어는 여러 번 나올 수 있기 때문에, 여러 작업자에서 나온 hello 값들을 하나로 합쳐야 합니다.

  • 이 단계에서 디스크에서 읽어온 중간 결과를 바탕으로 데이터를 정렬하고, 같은 키들을 모은 후 리듀스 작업자에게 전달합니다.

4. Reduce 단계

  • 리듀스 작업자는 중간 결과를 읽어서 각 단어의 총 빈도수를 합칩니다.
    예를 들어, hello에 대한 (5, 2) 쌍을 합쳐서 7번, world는 3번, python은 7번으로 계산됩니다.

  • 리듀스 작업자는 최종 결과를 디스크에 기록하거나 다른 시스템에 저장합니다.

최종결과

(hello, 7)
(world, 3)
(python, 7)

맵리듀스에서 디스크 I/O의 역할

  • 디스크 I/O는 맵리듀스에서 중요한 역할을 합니다. 맵 단계에서 중간 데이터를 디스크에 기록하고, 그 데이터를 리듀스 단계에서 읽어 처리하는 방식은 병렬 처리대용량 데이터 처리에 필수적입니다.

  • Shuffle & Sort 단계에서 디스크에 저장된 중간 결과를 읽어서 정렬하고 합치는 작업은 데이터가 커질수록 중요한 부분입니다.

맵리듀스가 파일을 떨구고 다시 올려서 처리하는 이유

1. 대용량 데이터 처리: 한 대의 머신에서 처리할 수 없는 데이터는 디스크에 저장하여 여러 작업자가 분산해서 처리합니다.
이때 디스크는 메모리의 한계를 넘어서기 위한 버퍼 역할을 합니다.

2. 병렬 처리: 데이터를 분할하여 여러 머신에서 동시에 처리하고, 각 머신에서 나온 결과를 다시 모으기 위해 파일 시스템에 데이터를 떨구고 읽어오는 방식을 사용합니다.

3.내결함성: 중간 결과를 디스크에 저장함으로써 작업이 실패했을 때 데이터를 잃지 않고 재시작할 수 있습니다.

결론

맵리듀스는 대용량 데이터를 처리할 때 매우 효율적입니다.

각 작업자들이 분산 환경에서 병렬로 처리하고, 중간 결과를 디스크에 저장한 후 다시 가져와서 처리하는 방식은 메모리의 한계를 극복하고 대규모 데이터 처리를 가능하게 합니다.

중간에 데이터를 "떨구고" 다시 메모리에 올리는 방식은 디스크 I/O를 활용하여 처리할 수 있는 데이터 크기를 확장하는 핵심적인 방식입니다.

profile
에러가 나도 괜찮아 — 그건 내가 배우고 있다는 증거야.

0개의 댓글