MapReduce
HDFS가 데이터 저장에 관련된 업무를 한다면 MapReduce, Spark 등은 데이터 분석 / 처리를 담당한다.
1. 개념
- MapReduce란 빅데이터를 처리하는 방법론이다.
맵리듀스(MapReduce)는 구글에서 대용량 데이터 처리를 분산 병렬 컴퓨팅에서 처리하기 위한 목적으로 제작하여 2004년 발표한 소프트웨어 프레임워크다
이 프레임워크는 페타바이트 이상의 대용량 데이터를 신뢰도가 낮은 컴퓨터로 구성된 클러스터 환경에서 병렬 처리를 지원하기 위해서 개발되었다
이 프레임워크는 함수형 프로그래밍에서 일반적으로 사용되는 Map과 Reduce라는 함수 기반으로 주로 구성된다
현재 MapReduce는 Java와 C++, 그리고 기타 언어에서 적용이 가능하도록 작성되었다
대표적으로 아파치 하둡에서 오픈 소스 소프트웨어로 적용되었다
- 3개의 로직으로 구분된다.
1) Mapper 2) Shuffle 3) Reducer
데이터가 '행'으로 쪼개져서 전해진다 → |
Mapper | Shuffle | Reducer | |
초기 단계 | 중간 단계 | 마지막 단계 | ||
'행'으로 쪼개진 데이터를 받아서 처리할 방식 결정 |
데이터를 모아서 정렬 | 정렬된 데이터를 어떻게 처리할지 결정 |
*Mapper와 Reducer는 개발자가 원하는 방식으로 프로그래밍한다.
Mapper 코드 예시)
import sys
for line in sys.stdin : # 표준 입력값을 받아서 행으로 나눈다
line = line.strip() # 행의 정보에 대한 사전처리 (양 끝의 공백제거)
words = line.split() # 받은 행의 정보를 공백을 구분자로 나눈다
for word in words : # 공백을 기준으로 나눈 행의 정보를 한 단어씩 확인한다
print('%s\t%s' %(word, 1)) # 나눈 단어마다 1과 함께 표준출력으로 출력
Shuffle 코드 예시)
# Shuffle을 거쳐서 데이터가 정렬되어 Reducer로 전해진다
current_word = None
current_count = 0
word = None
for line in sys.stdin :
line = line.strip()
word, count = line.split('\t',1) # split('separator',max_split=-1)
try :
count = int(count) # 횟수가 숫자인지
except ValueError :
continue # 빈 데이터라면 continue
# shuffle 과정을 거친 데이터는 정렬이 되어있기 때문에
if current_word == word : # 단어가 중복이면
current_count += count # 횟수를 더해준다
else :
if current_word : # 새로운 단어라면
print('%s\t%s' %(current_word, current_count) ) #그 전 단어의 빈도수 출력
current_count = count # 비교기준을 새로운 단어로 지정한다
current_word = word
if current_word == word :
print('%s\t%s' % (current_word, current_count))
2. Eco-system (e.g. Hive, HBase, Sqoop, etc.)
- Hive(HiveQL)는 Hadoop의 MapReduce 과정에서 개발자가 좀 더 쉽게 분산 처리를 하도록 도와주는 시스템이다.
- Hive(HiveQL)은 SQL과 비슷한 언어의 모습을 가지고 있다.
- Hive는 내부에서 mapper와 reducer를 생성하여 MapReducer 프레임워크에 자동으로 넣어준다.
* Spark (PySpark)
- MapReducer의 상위호환적인 방식으로 근래에는 MapReduce보다 주로 사용되는 방식
- 데이터 처리, 분석 구현 가능
- ML(머신러닝) 구현 가능
- SQL 처리 가능
- In-memory 방식(속도가 매우 빠르다, MapReduce 대비 100배 가량 빠르다고 한다)