Computer Language/Apache Spark

[Spark] 등장배경1 - 구글의 빅데이터 분산처리 발전

정우섭 2024. 3. 9. 00:15

구글은 검색에서 방대한 규모의 인터넷 문서를 다룬다.

 

구글 검색엔진이 발전하던 중 헤아릴 수 없는 양의 문서를 다루고 index를 만드는 것이 당시 RDBMS 같은 전통적인 저장시스템 뿐만 아니라 어떤 프로그래밍 수단으로도 불가능했다.

 

따라서 구글은 이 문제를 해결하기 위해 GFS(Google File System), MapReduce, BigTable 등을 만들어 냈다.

 

GFS는 클러스터 안에서 상용 서버에 장애 내구성이 있는 분산 파일 시스템을 제공했고, BigTable은 GFS를 기반으로 구조화된 대규모 데이터의 저장 수단을 제공했다.

 

MapReduce는 함수형 프로그래밍 개념을 기반으로 GFS와 빅테이블 위에서 대규모 데이터 분산 처리가 가능한 새로운 병렬 프로그래밍의 패러다임을 소개했다.

 

먼저 MapReduce가 뭔지 알아보자.

 

 

 

MapReduce

MapReduce란 대규모 데이터 세트를 병렬로 처리할 있는 프로그래밍 모델 관련 구현체를 말한다.

 

MapReduce 프로그래밍 모델은 input / 쌍을 받아 output / 쌍을 만든다. 이를 위해 맵리듀스 라이브러리 사용자는 컴퓨팅을 Map Reduce 2가지 함수로 표현한다.

 

Map 함수: 사용자가 작성하며, input 쌍을 받아서 중간결과물의 - 쌍을 생성, 맵리듀스 라이브러리는 같은 키를 가진 중간결과물을 모아 Reduce 함수로 전달(Shuffle and Sort 단계)

(이 단계에서 입력된 대규모 데이터를 더 작은 문제들로 나누어 병렬처리가 가능하게 된다.)

 

Reduce 함수: 사용자가 작성하며, Map 넘긴 중간결과물은 - 쌍을 받아  작은 데이터로 만든다. 중간결과물은 사용자가 작성한 Reduce ‘iterator’ 통해 전달되는데, 이는 메모리에 적재하기 너무 큰 값 처리를 도와준다.

 

MapReduce 모델의 작동 순서

 

1. 입력 데이터 준비 및 분할(Splitting)
작동 순서: 입력 데이터를 병렬처리 하기위해 작은 덩어리로 나눕니다(split). 이렇게 나눠진 각 덩어리는 개별적으로 맵 함수에 의해 처리될 수 있게 됩니다.
라이브러리 기능: 대부분의 맵리듀스 라이브러리는 자동으로 데이터를 스플릿하는 기능을 제공합니다. 예를 들어, 하둡(Hadoop)은 HDFS에 저장된 데이터를 자동으로 스플릿합니다.


2. 맵(Map) 단계
작동 순서: 각 스플릿은 독립적인 맵 태스크에 의해 처리됩니다. 맵 함수는 입력 데이터를 읽고, 처리하여 중간 키-값 쌍을 생성합니다.
라이브러리 기능: 사용자는 맵 함수를 정의할 수 있으며, 맵리듀스 라이브러리는 이 함수를 자동으로 각 데이터 스플릿에 적용합니다.


3. 셔플(Shuffle) 단계
작동 순서: 맵 단계의 출력이 키에 따라 정렬되고 그룹화됩니다. 이 과정에서 같은 키를 가진 데이터는 같은 리듀스 태스크로 전달됩니다.
라이브러리 기능: 셔플 과정은 맵리듀스 프레임워크에 의해 자동으로 관리됩니다. 사용자는 이 과정을 직접 제어할 필요가 없습니다.


4. 리듀스(Reduce) 단계
작동 순서: 리듀스 태스크는 셔플 단계에서 받은 중간 데이터를 입력으로 받아, 최종 결과를 생성합니다. 이때, 리듀스 함수는 같은 키를 가진 모든 값들에 대해 작동하여, 최종 결과를 도출합니다.
라이브러리 기능: 사용자는 리듀스 함수를 정의할 수 있으며, 맵리듀스 라이브러리는 이 함수를 셔플 단계의 출력 데이터에 적용합니다.


5. 결과 출력
작동 순서: 최종 결과는 파일 시스템이나 데이터베이스 등에 저장됩니다.
라이브러리 기능: 대부분의 맵리듀스 라이브러리는 결과를 저장하기 위한 메커니즘을 제공합니다. 예를 들어, 하둡은 처리 결과를 HDFS에 저장할 수 있습니다.


선택적 단계: 컴바인(Combine) 단계
작동 순서: 맵 단계의 출력을 로컬에서 사전 처리하여 네트워크를 통한 데이터 전송량을 줄입니다. 이는 맵 단계와 리듀스 단계 사이에 선택적으로 사용될 수 있습니다.
라이브러리 기능: 맵리듀스 라이브러리는 종종 컴바이너를 구현할 수 있는 옵션을 제공합니다. 컴바이너는 성능 최적화를 위해 사용되며, 맵 단계의 출력을 줄이는 역할을 합니다.


대표적인 맵리듀스 라이브러리인 하둡은 위에서 언급한 모든 단계를 지원하며, 사용자가 맵 함수와 리듀스 함수를 정의할 수 있도록 합니다. 또한, 자동 셔플 및 결과 저장 기능을 포함하여, 맵리듀스 모델을 효율적으로 실행할 수 있는 포괄적인 프레임워크를 제공합니다.

 

 

아래는 문자를 입력받아 키/값(알파벳/알파벳의 개수) 쌍을 결과로 출력하는 맵리듀스 모델의 예시입니다.

 

 

MapReduce 모델의 한계점

1. 복잡한 셔플링

MapReduce 모델에서는 Shuffling 과정이 복잡하고 속도가 매우 느리다는 문제가 있다.

 

2. 실행 단계의 병렬화 불가

Input - Split - Map Phase - Shuffle - Reduce 단계를 순차적으로 진행해야 하기 때문에 각 단계가 병렬적으로 실행되게 만들 수가 없어 모델의 작동속도가 느리다.

 

3. 파일 입출력으로 인한 오버헤드

각의 노드들은 map이나 reduce 작업을 하기 위해 파일 입출력을 한다. Map 함수는 GFS에서 데이터를 읽어와서 키-값 쌍을 생성한 뒤, 자신의 디스크 공간에 파일을 쓴다. Reduce 함수는 다시 해당 파일을 읽어와서 Reduce 작업을 진행한 다음 결과 파일을 GFS에 출력한다. 결과적으로 반복되는 disk I/O가 많은 오버헤드를 발생시켜 성능이 저하된다.