124
'하용호' 라고 합니다. kth 클라우드연구소 분산기술랩에서 즐겁게 일하고 있습니다. '프리즘 파일 시스템'이라는 분산파일 시스템, 'iLock'이라 이름 붙 인 분산 동기화 서비스, 그리고 새로운 검색엔진을 만들고 있습니다. 분산처 리, 데이터마이닝을 연구해 왔습니다. 대량의 자료를 다루는 것을 좋아합니 다. Data Scientist를 지향합니다. 파이썬은 쉬운 구조와 빠른 작성 속도를 강점으로 하여 이미 주류언어로 대 중화 되었습니다. 과거에 비교적 간단한 작업에 많이 쓰였던 파이썬을 분산 처리, 병렬처리를 사용하여 큰 문제들을 풀어내는 데 활용하는 방법들을 알 아봅니다. 멀티코어를 이용하고, 수십 대의 컴퓨터로 병렬처리하고, Hadoop과 아마존 클라우드를 사용하여 분산 처리하는 방법들까지 알아봅 니다. 하용호 파이썬으로 클라우드 하고 싶어요. @yonghosee

2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

Embed Size (px)

DESCRIPTION

파이썬으로 멀티코어, 멀티노드, 클라우드를 활용하는 방법에 대해 살펴봅니다. 파이썬으로 어떻게 하면 분산처리 병렬처리를 잘 할 수 있을까요?

Citation preview

Page 1: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

'하용호' 라고 합니다. kth 클라우드연구소 분산기술랩에서 즐겁게 일하고

있습니다. '프리즘 파일 시스템'이라는 분산파일 시스템, 'iLock'이라 이름 붙

인 분산 동기화 서비스, 그리고 새로운 검색엔진을 만들고 있습니다. 분산처

리, 데이터마이닝을 연구해 왔습니다. 대량의 자료를 다루는 것을 좋아합니

다. Data Scientist를 지향합니다.

파이썬은 쉬운 구조와 빠른 작성 속도를 강점으로 하여 이미 주류언어로 대

중화 되었습니다. 과거에 비교적 간단한 작업에 많이 쓰였던 파이썬을 분산

처리, 병렬처리를 사용하여 큰 문제들을 풀어내는 데 활용하는 방법들을 알

아봅니다. 멀티코어를 이용하고, 수십 대의 컴퓨터로 병렬처리하고,

Hadoop과 아마존 클라우드를 사용하여 분산 처리하는 방법들까지 알아봅

니다.

하용호

파이썬으로 클라우드 하고 싶어요.

@yonghosee

Page 2: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

분산기술Lab I 하용호

파이썬으로 클라우드 하고 싶어요!

Page 3: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

3

용 호 용 호

Page 4: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

위치 : 창원시 의창구 용호동

Page 5: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

위치 : 강화도 선두리 어시장(우리집 아님)

Page 6: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

우리의 주제 파이썬으로 분산처리도 해보고 병렬처리도 해보고 클라우드도 써보자.

Page 7: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

응=_=?

2011/11/21/월요일 프로그램 테이블 발표

Page 8: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

구석!

Page 9: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

구석!

Page 10: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

이럴 수가! 우리가 마이너라니!!

Page 11: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
Page 12: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

하지만 시대는 멀티코어

Page 13: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

심지어 휴대폰도 쿼드코어

Page 14: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

하지만 시대는 빅데이터

Page 15: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

대강 이정도

Page 16: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

그렇다!

Page 17: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

우리가

쎈타 오브 유니버스

여기쯤

Page 18: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

쫄지마세요!

Page 19: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

걱정 말아요

우리는 잘될 겁니다. 일확천금을 노리세^^;;

Page 20: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

본론을 시작합니다.

Page 21: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

& 시대는 다시 강조 빅데이터

분산처리

Page 22: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

MULTI CORE

Page 23: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

MANY MACHINES

Page 24: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

CLOUD

Page 25: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

하지만 분산프로그래밍은 어렵습니다.

Page 26: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

to LEARN

to WRITE

to RUN Hard

Page 27: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

원인은

의외로 반복 사용이 되지 않는다.

작성하는데 굉장히 어렵다.

네트워크나 디스크가 병목점일 때가 많다.

관련되어 많은 라인을 써야 한다.

조금씩 고쳐야 되는 일은 많다.

Page 28: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

해답은

Page 29: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

해답은 Md5 해쉬값을 구하고 싶어요?

파일을 압축하고 싶어요?

웹페이지를 긁어오고 싶어요?

REST 웹서버를 만들고 싶어요?

hashlib.md5(“python is so powerful").hexdigest() 그건 일도 아니죠. import gzip f = gzip.open('example.txt.gz', 'wb') f.write('Contents of the example go here.\n') f.close() 그건 일도 아니죠.

import urllib2 response = urllib2.urlopen('http://google.com/') data = response.read() print data

그건 일도 아니죠.

from flask import Flask app = Flask(__name__) @app.route("/“, methods=[‘GET’]) def hello(): return "Hello World!" if __name__ == "__main__": app.run()

그건 일도 아니죠.

Page 30: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

JAVA

PYTHON

Perl, Ruby

마이너 아님(아마도)

해답은

Page 31: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

해답은

의외로 반복 사용이 되지 않는다.

작성하는데 굉장히 어렵다.

네트워크나 디스크가 병목점일 때가 많다.

관련되어 많은 라인을 써야 한다.

조금씩 고쳐야 되는 일은 많다.

작성 완전 쉬워요

쉽게 가져다 쓸 라이브러리가 많아요

계산이 느린 것은 상쇄됩니다.

한번 쓸 코드 짜기 딱 좋죠

인터프리터 좋다는 게 뭔가요^^

Page 32: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

to LEARN

to WRITE

to RUN Easy

Page 33: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

파이썬으로 하는 분산프로그래밍은 쉽습니다(?)

Page 34: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

자 그러면

Page 35: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

멀티코어를 써보자!

Page 36: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

처음 떠 오르는 것?

쓰레드

쓰레드

프로세스

쓰레드(Thread) !!!

Page 37: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

간단한 덧셈 프로그램

Page 38: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

from threading import Thread def do_work(start, end, result): sum = 0 for i in range(start, end): sum += i result.append(sum) return if __name__ == "__main__": START, END = 0, 20000000 result = list() th1 = Thread(target=do_work, args=(START, END, result)) th1.start() th1.join() print "Result : ", sum(result)

start부터 end까지 더해요

쓰레드 1개를 써봅시다.

Page 39: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

real 0m3.523s

$ time python 1thread.py Result : 199999990000000

쓰레드 1개

Page 40: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

2개 쓰면 더 빨라지겠지?

Page 41: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

from threading import Thread def do_work(start, end, result): sum = 0 for i in range(start, end): sum += i result.append(sum) return if __name__ == "__main__": START, END = 0, 20000000 result = list() th1 = Thread(target=do_work, args=(START, END/2, result)) th2 = Thread(target=do_work, args=(END/2, END, result)) th1.start() th2.start() th1.join() th2.join() print "Result : ", sum(result)

start부터 end까지 더해요

쓰레드 2개를 써봅시다.

Page 42: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

real 0m3.523s

$ time python 1thread.py Result : 199999990000000

쓰레드 1개

0m4.225s

$ time python 2thread.py Result : 199999990000000

쓰레드 2개

응-_-?

real

Page 43: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
Page 44: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
Page 45: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

왜 이런 일이 발생했을까요?

Page 46: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

길 때문입니다.

Page 47: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

GIL ! (Global Interpreter Lock)

Page 48: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

쓰레드 #1

쓰레드 #2

쓰레드 #3

쓰레드 #4

인터프리터도 자원을 보호해야 합니다.

PYTHON VM

Page 49: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

Coarse- Grained Lock

Page 50: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

PYTHON VM

쓰레드 #2

쓰레드 #3

Coarse-Grained Lock

쓰레드 #1

쓰레드 #4

Page 51: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

Fine- Grained Lock

Page 52: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

PYTHON VM

쓰레드 #2

쓰레드 #3

Fine-Grained Lock

쓰레드 #1

쓰레드 #4

Page 53: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

파이썬의 선택

One Big Lock = Global Interpreter Lock

guido van rossum

Page 54: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

PYTHON VM

쓰레드 #4

쓰레드 #3

쓰레드 #2

Global Interpreter Lock

쓰레드 #1

Page 55: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

일해요

나도 일해요

우리가 바란 것

맨날 일해요

Page 56: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

GIL때문에 일어난 일

놀아요 계산

놀아요 놀아요

놀아요

계산

계산

계산

놀아요

자물쇠는 하나뿐 한 CPU만 일(계산)한다!

Page 57: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

왜 이렇게 만들었을까?

왜 그러셨어요…

Page 58: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

GIL을 도입하면

인터프리터의 구현이 쉬워집니다.

Garbage Collector 만들기도 좋습니다.

C/C++ 확장 모듈 만들기를 쉽게 해줍니다.

이 때문에 파이썬이 쉽게 퍼질 수 있었습니다.

Page 59: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

GIL을 도입하던 시기는

1990년대, 개인용 멀티코어는 한참 남은 이야기

특별히 손해 볼 것이 없었음

그렇지만 멀티코어 시대에 타박을 듣고 있어요!

CPU는 한 개 뿐, 딴 언어도 시분할(Time-Sharing)

Page 60: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

파이썬 쓰레드는 천하 쓸모없나요?

Page 61: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

프로그램이 I/O를 많이쓰면 Python 쓰레드도 좋다!

CPU

놀아요

READ/WRITE

놀아요

CPU READ/WRITE

READ/WRITE

READ/WRITE

CPU

CPU

우리가 하는 일반 프로그래밍은 대부분 I/O bound!! 이득 봅니다~!

Page 62: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

그럼 계산이 많은 쓰레드는?

방법이 없나요?

Page 63: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

Multiprocessing module

http://docs.python.org/library/multiprocessing.html

쓰레드 대신 프로세스를 만들어주는 라이브러리

Page 64: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

이가 없으면 잇몸으로! 쓰레드가 부실하면 프로세스로!

Page 65: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

쓰레드

프로세스

놀아요

놀아요 쓰레드 놀아요

쓰레드

일합니다.

프로세스

일합니다.

프로세스

multiprocessing 모듈은 쓰레드 대신 프로세스를 띄워줍니다.

Page 66: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

from multiprocessing import Process, Queue def do_work(start, end, result): sum = 0 for i in range(start, end): sum += i result.put(sum) return

if __name__ == "__main__": START, END = 0, 20000000 result = Queue() pr1 = Process(target=do_work, args=(START, END/2, result)) pr2 = Process(target=do_work, args=(END/2, END, result)) pr1.start() pr2.start() pr1.join() pr2.join() result.put('STOP') sum = 0 while True: tmp = result.get() if tmp == 'STOP': break else: sum += tmp print "Result : ", sum

Page 67: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

0m4.225s

$ time python 2thread.py Result : 199999990000000

쓰레드 2개

real 0m1.880s

$ time python 2process.py Result : 199999990000000

프로세스 2개

real

성공! 4.2

1.8

2 thread 2 process

수행시간(sec)

Page 68: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

Multiprocessing 은

쓰레드 쓰듯 프로세스를 쓸 수 있습니다.

th1 = Thread(target=do_work, args=(START, END, result)) th1.start() th1.join()

pr1 = Process(target=do_work, args=(START, END, result)) pr1.start() pr1.join()

Page 69: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

Multiprocessing 은

동기화 도구들도 모두 지원합니다.

multiprocessing.Condition multiprocessing.Event multiprocessing.Lock multiprocessing.RLock multiprocessing.Semaphore

threading.Condition threading.Event threading.Lock threading.RLock threading.Semaphore

코드 수정 없이 이름만 바꾸어줘도 동작합니다.

Page 70: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

파이썬에서 멀티코어! 잘 쓸 수 있습니다.

Page 71: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

여러 대를 써보자!

Page 72: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

쓰레드가 부실해서 프로세스 쓰다니

꼼수 같아요

Page 73: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

아닙니다! 대량 분산엔 원래 프로세스가 답

Page 75: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

프로세스

프로세스

프로세스

프로세스

프로세스

머신을 넘어선 대량 분산 결국 프로세스가 답

Page 76: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

세상만사 돌고돈다.

프로세스 쓰레드

Page 77: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

프로세스를 여러 대에

쉽게 뿌려주는 방법은?

Page 78: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

Parallel Python http://www.parallelpython.com/

프로세스를 여러머신에 뿌리기 위한 라이브러리

Page 79: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

Parallel Python의 특징은

홈페이지가 멋이 없음

그러나 아주 쓰기 쉬움

Page 80: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

$ ppserver.py -a

job_server = pp.Server(ppservers=ppservers)

f1 = job_server.submit(func, args)

ppservers=(“*”)

“192.168.1.3”

“192.168.1.2”

$ ppserver.py -a “192.168.1.4”

f2 = job_server.submit(func, args)

result1 = f1()

result2 = f2()

import pp

Page 81: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

9.3

5.1

3.5

1 node 2 node 3 node

수행시간(sec)

0~160000000 더하기

Page 82: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

싱글 머신의 멀티코어 활용에도 쓸 수 있다.

Worker머신 자동 찾기 기능도 있다.

일을 callback형태로 시킬 수도 있다.

Parallel Python의 장점은

Page 83: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

파이썬에서 여러 머신! 쉽게 쓸 수 있습니다.

Page 84: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

클라우드를 써보자!

Page 85: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

이전부터 Hadoop, MapReduce 이런 것들이 유명하던데 그건 못 쓰나요?

Page 86: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

어렵지 않아요~~

Page 87: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

MapReduce http://en.wikipedia.org/wiki/MapReduce

나누기와 모으기로 이루어진 분산처리 방법론

Page 88: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

OSDI 2004년 발표

Page 89: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

MapReduce의 이해 - 나는 반장이다-

Page 90: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

“반장. 이 책에 각 단어들이

몇 번씩 나왔는지 세어줄래?”

선생님 말씀

Page 91: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

헐…

Page 94: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

MapReduce 큰 작업을

잘게 나누기(map) 종류별로 모으기(reduce)

로 처리하는 방식을 말합니다.

Page 95: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

어째서 MapReduce는 큰 인기를 끌었는가?

Page 96: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

구글님이 쓰신다는 위엄?

Page 97: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

이유는 Hadoop!!

Page 98: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

Hadoop이전의 분산처리

고민해야 하는 것

일을 어떻게 분배해야 하는가?

프로그램을 어떻게 원격에 전송하나?

나눈 일의 스케쥴링은 어쩌지?

돌다가 실패한 작업은 어떻게 하지?

또~ 또~ @.@

Page 99: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

Hadoop이후의 분산처리

고민해야 하는 것

Map을 어떻게 짤까?

Reduce를 어떻게 짤까?

Page 100: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

Hadoop이전 필요했던 개발자 Hadoop이후

분산처리에 대한 기술장벽을 낮추었습니다.

Page 101: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

구텐베르크 할아버지(1398~1468) 금속 활판 인쇄술

지식의 대중 보급이 시작

(물론 우리도 직지심경있음)

Hadoop이후 수많은 start-up과 기존 업체가 분산처리를 할 수 있게 됨

분산 병렬처리의 대중 보급

Page 102: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

하지만 Hadoop은 JAVA기반

다른 언어는 어쩌나요?

STDIN/STDOUT을 이용한 데이터 스트리밍 HadoopStreaming

= Python, Ruby등 어떤 언어로든 가능해짐

Page 103: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

미국의 맛집 사이트

고객 로그와 평가에 기반한 추천

맛있다고 해서 가면 맛있음!!(놀라워!)

하루 로그 100GB

HadoopStreaming 에 집중한 업체

Page 104: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

이 회사 사람들은 Python 매니아.

Hadoop도 쓰고 싶다.

Siri on iphone4s

Python도 쓰고 싶다.

그럼 만들지 뭐~

Page 105: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

mrJob https://github.com/Yelp/mrjob

HadoopStreaming을 쉽게 쓰기 위한 Python Library

by

Page 106: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

from mrjob.job import MRJob class MRWordCounter(MRJob): def mapper(self, key, line): for word in line.split(): yield word, 1 def reducer(self, word, occurrences): yield word, sum(occurrences) if __name__ == '__main__': MRWordCounter.run()

반장의 단어 세기 프로그램 : mrjob을 이용한 버전

문장을 나누고 (단어, 1)을 리턴해요

들어온 단어를 세어요

Page 107: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

$ python word_count.py data.txt --runner=local --output-dir=result

디버깅을 위해서, 굳이 Hadoop을 띄우지 않고 로컬로

Hadoop으로 할때는 runner만 변경하면 됨

$ export HADOOP_HOME=~~~~~ $ python word_count.py data.txt --runner=hadoop --output-dir=result

Page 108: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

회사에 머신이 충분히 없다면?

Page 109: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

사장님 분산처리하게 컴퓨터 100대만 사주세요

Page 110: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

결제문서가 아니라 이력서를 쓰게 될 지도 모릅니다.

Page 111: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

사.. 사장님께서 사주셨어 100대에 프로그램 설치해야 해

사주셔도 문제

ㅠ.ㅠ

Page 112: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

그런 우리를 위해

Page 113: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

ElasticMapReduce http://aws.amazon.com/elasticmapreduce/

아마존이 제공하는 Hadoop 호스팅 서비스

Page 114: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
Page 115: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

아마존 님이 OS에 Hadoop까지 설치해서 대령해 주십니다.

쓴 만큼만 돈 내면 됨

머신 안사도 됩니다.

우리도 클라우드 유저!

Large Instance 기준 7.5G 메모리, 4 EC2 Compute Units 머신

100대를 1시간쓰는데 $ 6

Page 116: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

$ python word_count.py data.txt --runner=local --output-dir=result

그리고 mrjob의 놀라운 기능

$ export AWS_ACCESS_KEY_ID=~~~~ $ export AWS_SECRET_ACCESS_KEY=~~~~ $ python word_count.py data.txt --runner=emr --output-dir=s3://yongho/result

runner만 바꾸면 아마존으로 전송되어 실행 됨!!!

Page 117: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
Page 118: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

Elastic MapReduce가 제일 분산 규모가 크니까 언제나 이걸로 하면 장땡인가요?

답: 세상일이 그렇게 쉽지 않음.

Page 119: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

no configs found; falling back on auto-configuration using existing scratch bucket mrjob-2a2aa23a8d6b1931 using s3://mrjob-2a2aa23a8d6b1931/tmp/ as our scratch dir on S3 Uploading input to s3://mrjob-2a2aa23a8d6b1931/tmp/word_count.yongho.20111104.053927.135643/input/ creating tmp directory /var/folders/v2/t63rb7x54f53_9mx4hmw_xqc0000gn/T/word_count.yongho.20111104.053927.135643 writing master bootstrap script to /var/folders/v2/t63rb7x54f53_9mx4hmw_xqc0000gn/T/word_count.yongho.20111104.053927.135643/b.py Copying non-input files into s3://mrjob-2a2aa23a8d6b1931/tmp/word_count.yongho.20111104.053927.135643/files/ Waiting 5.0s for S3 eventual consistency Creating Elastic MapReduce job flow Job flow created with ID: j-3BPUCHHQ1T5PC Job launched 32.2s ago, status STARTING: Starting instances Job launched 63.5s ago, status STARTING: Starting instances Job launched 94.4s ago, status STARTING: Starting instances Job launched 125.3s ago, status STARTING: Starting instances Job launched 156.4s ago, status STARTING: Starting instances Job launched 187.2s ago, status STARTING: Starting instances Job launched 218.1s ago, status BOOTSTRAPPING: Running bootstrap actions Job launched 249.1s ago, status BOOTSTRAPPING: Running bootstrap actions Job launched 280.0s ago, status RUNNING: Running step (word_count.yongho.20111104.053927.135643: Step 1 of 1) Job launched 310.9s ago, status RUNNING: Running step (word_count.yongho.20111104.053927.135643: Step 1 of 1) Job launched 342.2s ago, status RUNNING: Running step (word_count.yongho.20111104.053927.135643: Step 1 of 1) Waiting 5.0s for S3 eventual consistency

Job completed. Running time was 68.0s (not counting time spent waiting for the EC2 instances) Fetching counters... counters: [{'File Systems': {'Local bytes read': 341091, 'Local bytes written': 682264, 'S3N bytes read': 170755, 'S3N bytes written': 70720}, 'Job Counters ': {'Launched map tasks': 2, 'Launched reduce tasks': 1, 'Rack-local map tasks': 2}, 'Map-Reduce Framework': {'Combine input records': 0, 'Combine output records': 0, 'Map input bytes': 167508, 'Map input records': 3735, 'Map output bytes': 279513, 'Map output records': 29460, 'Reduce input groups': 6017, 'Reduce input records': 29460, 'Reduce output records': 6017}}] removing tmp directory /var/folders/v2/t63rb7x54f53_9mx4hmw_xqc0000gn/T/word_count.yongho.20111104.053927.135643 Removing all files in s3://mrjob-2a2aa23a8d6b1931/tmp/word_count.yongho.20111104.053927.135643/ Removing all files in s3://mrjob-2a2aa23a8d6b1931/tmp/logs/j-3BPUCHHQ1T5PC/ Terminating job flow: j-3BPUCHHQ1T5PC

세팅에 5분, 실행에 1분

자잘한 작업은 세팅하다 일 다봄 큼직한 일, 오래걸리는 일에 쓰자

1MB 텍스트 단어세기

Page 120: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

Multiprocessing module

Parallel Python

MapReduce

mrJob

ElasticMapReduce

REVIEW

MultiCore

Many Machines

Cloud

Page 121: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
Page 122: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

문제의 크기를 잘 산정하고 적절한 분산 규모를 택하고 적절한 방법을 선택하세요

Page 123: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

그것이 가장 최적의 분산처리 방법입니다.

Page 124: 2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요

감사합니다. 클라우드연구소 / 분산기술 Lab / 하용호

[email protected]

@yonghosee