MapReduce는 함수형 프로그래밍 언어에서 차용한 패턴으로, 일부 시나리오에서는 코드를 크게 단순화할 수 있습니다. 먼저 MapReduce가 무엇인지 살펴보겠습니다.
MapReduce는 Google이 대규모 데이터 세트(1TB 이상)에 대한 병렬 작업을 위해 제안한 소프트웨어 아키텍처입니다. "Map" 및 "Reduce"라는 개념과 주요 아이디어는 함수형 프로그래밍 언어뿐만 아니라 벡터 프로그래밍 언어에서도 가져온 기능입니다.
현재 소프트웨어 구현은 키-값 쌍 세트를 새로운 키-값 쌍 세트로 매핑하는 Map 함수를 지정하고, 매핑된 모든 키 값이 각각이 되도록 동시 Reduce 함수를 지정하는 것입니다. 쌍은 동일한 키 세트를 공유합니다.
간단히 말하면 MapReduce는 처리할 문제를 Map과 Reduce의 두 부분으로 분해합니다. 처리할 데이터는 시퀀스로 처리되며, 각 시퀀스의 데이터는 Map 함수를 통해 계산된 후 Reduce 함수를 통해 최종 결과로 집계됩니다.
다음은 mapreduce 모드를 사용하여 로그에서 단어 발생 횟수를 계산하는 간단한 프로그램을 구현합니다.
from functools import reduce from multiprocessing import Pool from collections import Counter def read_inputs(file): for line in file: line = line.strip() yield line.split() def count(file_name): file = open(file_name) lines = read_inputs(file) c = Counter() for words in lines: for word in words: c[word] += 1 return c def do_task(): job_list = ['log.txt'] * 10000 pool = Pool(8) return reduce(lambda x, y: x+y, pool.map(count, job_list)) if __name__ == "__main__": rv = do_task()