요즘 대부분의 시간을 Cambridge에서 보내는 관계로 오늘은 MIT의 Big Data Processing에 관한  겨울 수업에 잠깐 들어갔습니다. 오늘 수업은 MapReduce에 관한 것이었는데, MapReduce자체가 새로울 것은 없지만, 개념부터 Amazon Web Service를 사용한 실전까지 1시간 내에 따라해볼 수 있는 내용이라 여기서 간단히 소개합니다. 

http://dataiap.github.com/dataiap/

대부분 아시겠지만, MapReduce는 대용량 데이터 처리를 위한 프레임웍으로, 구글 논문에 처음 소개된 이래로 Yahoo 주도로 개발한 Hadoop 프레임웍이 널리 사용되고 있습니다. 최근에는 Amazon Web Service에서 가입형으로 사용할 수 있는 MapReduce 클러스터를 제공하여 Netflix를 포함한 많은 기업에서 활용하고 있습니다. 

오늘 실습은 MapReduce Python를 사용하여 Enron 이메일 코퍼스의 문서별 단어개수를 세고, 이를 Amazon클러스터에서 실행하는 것이었습니다. 구체적인 내용은 오늘의 강의자료를 참조하시고, 저는 맛보기로 여기 제가 실행한 코드와 결과물을 올릴까 합니다. 강의에서는 이를 좀더 심화하여 tf-idf계산까지를 다루었습니다. 

import sys
from mrjob.protocol import JSONValueProtocol
from mrjob.job import MRJob
from term_tools import get_terms

class MRWordCount(MRJob):
    INPUT_PROTOCOL = JSONValueProtocol
    OUTPUT_PROTOCOL = JSONValueProtocol

    def mapper(self, key, email):
        for term in get_terms(email['text']):
            yield term, 1

    def reducer(self, term, occurrences):
        yield None, {'term': term, 'count': sum(occurrences)}

if __name__ == '__main__'
MRWordCount.run() 
mapper에서 문서별 단어 개수를 세어 이를 단어별로 모아 reduce에서 합산하는 위 예제 코드를 아마존 클러스터에서 실행한 결과는 다음과 같습니다. 약 17~8분 정도에 완료되었습니다. (저도 아마존 클러스터는 처음 사용해 보았습니다.)

Running time was 1051.0s (not counting time spent waiting for the EC2 instances)

ec2_key_pair_file not specified, going to S3

Fetching counters from S3...

Waiting 5.0s for S3 eventual consistency

Counters from step 1:

  FileSystemCounters:

    FILE_BYTES_READ: 197488305

    FILE_BYTES_WRITTEN: 58258678

  Job Counters :

    Launched map tasks: 167

    Launched reduce tasks: 33

    Rack-local map tasks: 167

  Map-Reduce Framework:

    Map input bytes: 1405888038

    Map input records: 516893

    Map output bytes: 585440070

    Map output records: 49931418

    Reduce input groups: 232743

    Reduce input records: 49931418

    Reduce output records: 232743

    Reduce shuffle bytes: 26548380

    Spilled Records: 134445547  

사실 이 자체가 대단한 내용은 아니지만, 아직도 국내에서 신기술로 인식되고 있는 MapReduce가 (요즘은 안 그런가요?) 미국 대학의 교양 강좌에 소개될 정도로 툴 및 인프라가 발전했다는 사실을 느꼈습니다. MapReduce를 검색에 사용하는 방법을 좀더 배우고픈 분들은 Maryland의 Jimmy Lin 교수가 공개한 온라인 책을 읽어보시고, 위 수업에서는 이외에도 Python을 사용한 통계 및 데이터 시각화를 다루니, 참고하시기 바랍니다.