1. 하용호 @yonghosee
'하용호' 라고 합니다. kth 클라우드연구소 분산기술랩에서 즐겁게 일하고
있습니다. '프리즘 파일 시스템'이라는 분산파일 시스템, 'iLock'이라 이름 붙
인 분산 동기화 서비스, 그리고 새로운 검색엔진을 만들고 있습니다. 분산처
리, 데이터마이닝을 연구해 왔습니다. 대량의 자료를 다루는 것을 좋아합니
다. Data Scientist를 지향합니다.
파이썬으로 클라우드 하고 싶어요.
파이썬은 쉬운 구조와 빠른 작성 속도를 강점으로 하여 이미 주류언어로 대
중화 되었습니다. 과거에 비교적 간단한 작업에 많이 쓰였던 파이썬을 분산
처리, 병렬처리를 사용하여 큰 문제들을 풀어내는 데 활용하는 방법들을 알
아봅니다. 멀티코어를 이용하고, 수십 대의 컴퓨터로 병렬처리하고,
Hadoop과 아마존 클라우드를 사용하여 분산 처리하는 방법들까지 알아봅
니다.
29. 해답은
Md5 해쉬값을 구하고 싶어요?
그건 일도 아니죠.
파일을 압축하고 싶어요?
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
REST 웹서버를 만들고 싶어요?from flask import Flask
app = Flask(__name__)
그건 일도 아니죠. @app.route("/“, methods=[‘GET’])
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
31. 해답은
작성하는데 굉장히 어렵다.
작성 완전 쉬워요
관련되어 많은 라인을 써야 한다.
쉽게 가져다 쓸 라이브러리가 많아요
네트워크나 디스크가 병목점일 때가 많다.
계산이 느린 것은 상쇄됩니다.
의외로 반복 사용이 되지 않는다.
한번 쓸 코드 짜기 딱 좋죠
조금씩 고쳐야 되는 일은 많다.
인터프리터 좋다는 게 뭔가요^^
41. from threading import Thread
start부터
def do_work(start, end, result):
sum = 0 end까지
for i in range(start, end): 더해요
sum += i
result.append(sum)
return 쓰레드
if __name__ == "__main__":
2개를
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)
42. 쓰레드 1개 쓰레드 2개
$ time python 1thread.py $ time python 2thread.py
Result : 199999990000000 Result : 199999990000000
real 0m3.523s real 0m4.225s
응-_-?
61. CPU READ/WRITE
프로그램이 I/O를 많이쓰면 Python 쓰레드도 좋다!
C
P READ/WRITE
U
우리가 하는
일반 프로그래밍은
대부분 I/O bound!!
놀 C
아 P READ/WRITE
요 U
이득 봅니다~!
C
놀아요 P READ/WRITE
U
65. 프로세스
쓰레드 놀아요 쓰레드
놀아요 쓰레드 놀아요
multiprocessing 모듈은
쓰레드 대신 프로세스를 띄워줍니다.
프로세스
일합니다.
프로세스
일합니다.
66. 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
67. 쓰레드 2개 프로세스 2개
$ time python 2thread.py $ time python 2process.py
Result : 199999990000000 Result : 199999990000000
real 0m4.225s real 0m1.880s
성공!
수행시간(sec)
4.2
1.8
2 thread 2 process
68. 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()
69. Multiprocessing 은
동기화 도구들도 모두 지원합니다.
threading.Condition multiprocessing.Condition
threading.Event multiprocessing.Event
threading.Lock multiprocessing.Lock
threading.RLock multiprocessing.RLock
threading.Semaphore multiprocessing.Semaphore
코드 수정 없이 이름만 바꾸어줘도 동작합니다.
92. 애들을 풀어 일을 나눠 시킵니다.
map
KTH 1 많이 1 KTH 1 사장님 1 월급 1
멋있다 1 지원 1 많이 1 많이 1
하세요 1 멋있다 1 지원 1
93. 몇 명이 결과를 모아 계산합니다.
reduce
KTH 1 많이 1 KTH 1 사장님 1 월급 1
멋있다 1 지원 1 많이 1 많이 1
하세요 1 멋있다 1 지원 1
나는 A~Z를 모을께~ 난 ㄱ~ㅁ 난 ㅅ~끝까지
KTH 2 많이 3 사장님 1
멋있다 2 월급 1 지원 2
하세요 1
94. MapReduce
큰 작업을
잘게 나누기(map)
종류별로 모으기(reduce)
로 처리하는 방식을 말합니다.
106. 반장의 단어 세기 프로그램 : mrjob을 이용한 버전
from mrjob.job import MRJob 문장을 나누
고 (단어, 1)
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() 를 세어요
107. 디버깅을 위해서, 굳이 Hadoop을 띄우지 않고 로컬로
$ python word_count.py data.txt --runner=local --output-dir=result
Hadoop으로 할때는 runner만 변경하면 됨
$ export HADOOP_HOME=~~~~~
$ python word_count.py data.txt --runner=hadoop --output-dir=result