[데이터엔지니어링] Hadoop MapReduce에 대해서 알아보자 - (3편)

 

Hadoop MapReduce는 대규모 데이터를 병렬로 처리할 수 있도록 지원하는 분산 데이터 처리 프레임워크입니다.

MapReduce와 HDFS가 동일한 노드 집합에서 동작하는 경우, MapReduce는 데이터가 저장된 노드에서 작업을 실행하도록 Task를 스케줄링할 수 있어, 불필요한 데이터 전송을 최소화하여 효율적으로 데이터를 처리할 수 있습니다.

Map 작업과 Reduce 작업

https://www.edureka.co/blog/mapreduce-tutorial/

MapReduce는 MapReduce라는 두 가지 작업으로 구성됩니다. 

Map 단계에서는 입력 데이터 블록을 읽고 처리하여 중간 출력물인 key-value 쌍을 생성한 이후 Reduce 작업으로 전달됩니다.
Reduce 단계에서는 여러 맵 작업으로부터 Key-Value값 쌍을 받아, 동일한 key를 가진 값들을 집계하여 최종 결과를 생성합니다.

MapReduce 구현을 위한 Mapper, Reducer Interface

Mapper Interface

Mapper는 입력 key-value 쌍을 중간 key-value 쌍으로 매핑하는 역할을 합니다.

Hadoop MapReduce 프레임워크는 각 InputSplit마다 하나의 Map Task를 생성하고, InputSplit에 포함된 각 key-value 쌍에 대해 map() 메서드를 호출하여 중간 key-value 쌍을 생성합니다.

동일한 출력 키와 관련된 모든 중간 값들은 프레임워크에 의해 그룹화되며, 이후 최종 결과를 생성하기 위해 Reducer로 전달됩니다.

Reducer Interface

Reducer는 같은 키를 공유하는 중간 값들의 집합을 더 작은 값 집합으로 축소합니다.
Reducer에는 Shuffle, Sort, Reduce 세 가지 주요 단계가 있습니다.

1. Shuffle
각 Mapper에서 생성된 중간 데이터를 Reducer로 전달하는 과정. 

2. Sort
Reducer로 전달된 데이터를 키 값 기준으로 정렬하는 과정

3. Reduce
정렬된 데이터를 기반으로 Reducer가 데이터를 처리하고 최종 결과를 생성하여 저장하는 과정

Apache Spark의 탄생

MapReduce는 여러 작업을 연결하는 워크플로우를 지원하지 않습니다.
따라서 여러 MapReduce 작업 단계를 거쳐야 하는 경우, 각 작업의 출력 디렉토리를 다음 작업의 입력 경로로 지정하는 방식으로 디렉토리 경로를 통해 암묵적으로 워크플로우를 구성해야 합니다.

MapReduce Job1 → 결과(HDFS) → MapReduce Job2 → 결과(HDFS) → MapReduce Job3

이와 같이 여러 MapReduce 작업을 연결하기 위해 각 Job의 결과를 HDFS에 저장하는 방식으로 중간 상태를 구체화(materialization)하는게 필요합니다. 하지만 이 과정에서 매 단계마다 디스크 I/O와 네트워크 전송이 발생하기 때문에 실행 시간이 길어지고 비효율이 발생할 수 있습니다.

이를 해결하기 위해서 Spark는 중간 계산 결과를 디스크에 저장하는 대신 메모리에 유지하여 디스크 I/O를 줄이고 실행 속도를 향상시켰습니다.

이러한 특징 덕분에 Spark는 대규모 데이터 처리 환경에서 Hadoop MapReduce를 대체하는 처리 엔진으로 널리 사용되기 시작했습니다.