H3 2011 파이썬으로 클라우드 하고 싶어요
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 11,526 views

 

Statistics

Views

Total Views
11,526
Views on SlideShare
8,334
Embed Views
3,192

Actions

Likes
53
Downloads
344
Comments
3

37 Embeds 3,192

http://h3.paran.com 1764
http://www.gamecodi.com 511
http://devsw.tistory.com 296
http://ertai119.tistory.com 182
http://h3.kthcorp.com 101
http://gw.barunsongames.com 99
http://wordpress.beyondd.bitnamiapp.com 59
http://a0.twimg.com 44
http://search.daum.net 21
http://paper.li 18
https://www.facebook.com 16
http://us-w1.rockmelt.com 14
http://gguriya.tistory.com 11
http://www.hanrss.com 9
http://ics.innogs.com 7
https://twitter.com 6
http://devkeaton.wordpress.com 6
http://localhost 4
http://www.facebook.com 2
https://twimg0-a.akamaihd.net 2
http://webcache.googleusercontent.com 2
http://jhpark0803.wordpress.com 2
http://twitter.com 2
https://m.facebook.com&_=1375318887828 HTTP 1
https://m.facebook.com&_=1375280587749 HTTP 1
https://m.facebook.com&_=1375241501998 HTTP 1
https://m.facebook.com&_=1375241433327 HTTP 1
http://cafe.naver.com 1
https://m.facebook.com&_=1375243240413 HTTP 1
http://coolwarp.net 1
https://m.facebook.com&_=1375241523226 HTTP 1
https://m.facebook.com&_=1375233150418 HTTP 1
https://m.facebook.com&_=1375233137458 HTTP 1
https://m.facebook.com&_=1375232782842 HTTP 1
http://192.168.10.147:8901 1
http://blog.naver.com 1
http://dntds.dyndns.org 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • 잘봤습니다 감사합니다 ( _ _ )
    Are you sure you want to
    Your message goes here
    Processing…
  • 최고! -_-b
    Are you sure you want to
    Your message goes here
    Processing…
  • good!!
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

H3 2011 파이썬으로 클라우드 하고 싶어요 H3 2011 파이썬으로 클라우드 하고 싶어요 Presentation Transcript

  • 하용호 @yonghosee하용호 라고 합니다. kth 클라우드연구소 분산기술랩에서 즐겁게 일하고있습니다. 프리즘 파일 시스템이라는 분산파일 시스템, iLock이라 이름 붙인 분산 동기화 서비스, 그리고 새로운 검색엔진을 만들고 있습니다. 분산처리, 데이터마이닝을 연구해 왔습니다. 대량의 자료를 다루는 것을 좋아합니다. Data Scientist를 지향합니다.파이썬으로 클라우드 하고 싶어요.파이썬은 쉬운 구조와 빠른 작성 속도를 강점으로 하여 이미 주류언어로 대중화 되었습니다. 과거에 비교적 간단한 작업에 많이 쓰였던 파이썬을 분산처리, 병렬처리를 사용하여 큰 문제들을 풀어내는 데 활용하는 방법들을 알아봅니다. 멀티코어를 이용하고, 수십 대의 컴퓨터로 병렬처리하고,Hadoop과 아마존 클라우드를 사용하여 분산 처리하는 방법들까지 알아봅니다.
  • 파이썬으로클라우드하고 싶어요!분산기술Lab I 하용호
  • 하 용호 용 호 3
  • 위치 : 창원시 의창구 용호동
  • 위치 : 강화도 선두리 어시장(우리집 아님)
  • 우리의 주제 파이썬으로 분산처리도 해보고 병렬처리도 해보고 클라우드도 써보자.
  • 2011/11/21/월요일프로그램 테이블 발표 응=_=?
  • 구석!
  • 구석!
  • 이럴 수가!우리가 마이너라니!!
  • 하지만 시대는 멀티코어
  • 심지어 휴대폰도 쿼드코어
  • 하지만 시대는 빅데이터
  • 대강 이정도
  • 그렇다!
  • 우리가쎈타 오브 유니버스 여기쯤
  • 쫄지마 ! 세요
  • 걱정 말아요우리는 잘될 겁니다. 일확천금을 노리세^^;;
  • 본론을 시작합니다.
  • 다시 강조 빅데이터시대는 & 분산처리
  • MULTI CORE
  • MANY MACHINES
  • CLOUD
  • 하지만분산프로그래밍은 어렵습니다.
  • to LEARNHard to WRITE to RUN
  • 원인은작성하는데 굉장히 어렵다.관련되어 많은 라인을 써야 한다.네트워크나 디스크가 병목점일 때가 많다.의외로 반복 사용이 되지 않는다.조금씩 고쳐야 되는 일은 많다.
  • 해답은
  • 해답은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 dataREST 웹서버를 만들고 싶어요?from flask import Flask app = Flask(__name__) 그건 일도 아니죠. @app.route("/“, methods=[‘GET’]) def hello(): return "Hello World!" if __name__ == "__main__": app.run()
  • 해답은 JAVA PYTHON Perl, Ruby 마이너 아님(아마도)
  • 해답은작성하는데 굉장히 어렵다. 작성 완전 쉬워요관련되어 많은 라인을 써야 한다. 쉽게 가져다 쓸 라이브러리가 많아요네트워크나 디스크가 병목점일 때가 많다. 계산이 느린 것은 상쇄됩니다.의외로 반복 사용이 되지 않는다. 한번 쓸 코드 짜기 딱 좋죠조금씩 고쳐야 되는 일은 많다. 인터프리터 좋다는 게 뭔가요^^
  • to LEARNEasy to WRITE to RUN
  • 파이썬으로 하는분산프로그래밍은 쉽습니다(?)
  • 자 그러면
  • 멀티코어를 써보자!
  • 처음 떠 오르는 것?쓰레드(Thread) !!! 프로세스 쓰레드 쓰레드
  • 간단한 덧셈 프로그램
  • 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__": 1개를 START, END = 0, 20000000 써봅시다. result = list() th1 = Thread(target=do_work, args=(START, END, result)) th1.start() th1.join()print "Result : ", sum(result)
  • 쓰레드 1개$ time python 1thread.pyResult : 199999990000000real 0m3.523s
  • 2개 쓰면 더 빨라지겠지?
  • 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)
  • 쓰레드 1개 쓰레드 2개$ time python 1thread.py $ time python 2thread.pyResult : 199999990000000 Result : 199999990000000real 0m3.523s real 0m4.225s 응-_-?
  • 왜 이런 일이 발생했을까요?
  • 길때문입니다.
  • GIL !(Global Interpreter Lock)
  • 인터프리터도 자원을 보호해야 합니다. 쓰레드 쓰레드 쓰레드 쓰레드 #1 #2 #3 #4 PYTHON VM
  • Coarse-GrainedLock
  • Coarse-Grained Lock쓰레드 쓰레드 쓰레드 쓰레드 #1 #2 #3 #4 PYTHON VM
  • Fine-GrainedLock
  • Fine-Grained Lock쓰레드 쓰레드 쓰레드 쓰레드 #1 #2 #3 #4 PYTHON VM
  • One Big Lock = Global Interpreter Lock 파이썬의 선택guido van rossum
  • Global Interpreter Lock쓰레드 쓰레드 쓰레드 쓰레드 #1 #2 #3 #4 PYTHON VM
  • 우리가 바란 것 일해요 나도 일해요 맨날 일해요
  • GIL때문에 일어난 일자물쇠는 하나뿐 한 CPU만 일(계산)한다! 계산 놀아요 놀아요 계산 놀아요 계산 놀아요 계산 놀아요
  • 왜 이렇게 만들었을까? 왜 그러셨어요…
  • GIL을 도입하면인터프리터의 구현이 쉬워집니다.Garbage Collector 만들기도 좋습니다.C/C++ 확장 모듈 만들기를 쉽게 해줍니다.이 때문에 파이썬이 쉽게 퍼질 수 있었습니다.
  • GIL을 도입하던 시기는1990년대, 개인용 멀티코어는 한참 남은 이야기CPU는 한 개 뿐, 딴 언어도 시분할(Time-Sharing)특별히 손해 볼 것이 없었음그렇지만 멀티코어 시대에 타박을 듣고 있어요!
  • 파이썬 쓰레드는천하 쓸모없나요?
  • CPU READ/WRITE프로그램이 I/O를 많이쓰면 Python 쓰레드도 좋다! C P READ/WRITE U 우리가 하는 일반 프로그래밍은 대부분 I/O bound!! 놀 C 아 P READ/WRITE 요 U 이득 봅니다~! C 놀아요 P READ/WRITE U
  • 그럼 계산이 많은 쓰레드는? 방법이 없나요?
  • 쓰레드 대신 프로세스를 만들어주는 라이브러리Multiprocessing module http://docs.python.org/library/multiprocessing.html
  • 이가 없으면 잇몸으로!쓰레드가 부실하면 프로세스로!
  • 프로세스 쓰레드 놀아요 쓰레드 놀아요 쓰레드 놀아요multiprocessing 모듈은쓰레드 대신 프로세스를 띄워줍니다. 프로세스 일합니다. 프로세스 일합니다.
  • from multiprocessing import Process, Queuedef do_work(start, end, result): sum = 0 for i in range(start, end): sum += i result.put(sum) returnif __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
  • 쓰레드 2개 프로세스 2개$ time python 2thread.py $ time python 2process.pyResult : 199999990000000 Result : 199999990000000real 0m4.225s real 0m1.880s 성공! 수행시간(sec) 4.2 1.8 2 thread 2 process
  • 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()
  • Multiprocessing 은 동기화 도구들도 모두 지원합니다.threading.Condition multiprocessing.Conditionthreading.Event multiprocessing.Eventthreading.Lock multiprocessing.Lockthreading.RLock multiprocessing.RLockthreading.Semaphore multiprocessing.Semaphore 코드 수정 없이 이름만 바꾸어줘도 동작합니다.
  • 파이썬에서멀티코어!잘 쓸 수 있습니다.
  • 여러 대를 써보자!
  • 쓰레드가 부실해서 프로세스 쓰다니 꼼수 같아요
  • 아닙니다!대량 분산엔 원래 프로세스가 답
  • 쓰레드 쓰레드어차피 쓰레드는 한 컴퓨터 안에 갇힙니다.
  • 머신을 넘어선 대량 분산  결국 프로세스가 답 프로세스 프로세스 프로세스 프로세스 프로세스
  • 프로세스 쓰레드세상만사 돌고돈다.
  • 프로세스를 여러 대에 쉽게 뿌려주는 방법은?
  • 프로세스를 여러머신에 뿌리기 위한 라이브러리Parallel Python http://www.parallelpython.com/
  • Parallel Python의 특징은 홈페이지가 멋이 없음 그러나 아주 쓰기 쉬움
  • “192.168.1.2”import ppppservers=(“*”)job_server =pp.Server(ppservers=ppservers) “192.168.1.3” “192.168.1.4” $ ppserver.py -a $ ppserver.py -af1 = job_server.submit(func, args)f2 = job_server.submit(func, args)result1 = f1()result2 = f2()
  • 0~160000000 더하기 수행시간(sec) 9.3 5.1 3.51 node 2 node 3 node
  • Parallel Python의 장점은싱글 머신의 멀티코어 활용에도 쓸 수 있다.Worker머신 자동 찾기 기능도 있다.일을 callback형태로 시킬 수도 있다.
  • 파이썬에서여러 머신!쉽게 쓸 수 있습니다.
  • 클라우드를 써보자!
  • 이전부터Hadoop, MapReduce이런 것들이 유명하던데그건 못 쓰나요?
  • 어렵지 않아요~~
  • 나누기와 모으기로 이루어진 분산처리 방법론 MapReduce http://en.wikipedia.org/wiki/MapReduce
  • OSDI 2004년 발표
  • MapReduce의 이해- 나는 반장이다-
  • 선생님 말씀“반장. 이 책에 각 단어들이 몇 번씩 나왔는지 세어줄래?”
  • 헐…
  • 애들을 풀어 일을 나눠 시킵니다. mapKTH 1 많이 1 KTH 1 사장님 1 월급 1멋있다 1 지원 1 많이 1 많이 1 하세요 1 멋있다 1 지원 1
  • 몇 명이 결과를 모아 계산합니다. 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
  • MapReduce 큰 작업을 잘게 나누기(map) 종류별로 모으기(reduce)로 처리하는 방식을 말합니다.
  • 어째서 MapReduce는큰 인기를 끌었는가?
  • 구글님이 쓰신다는 위엄?
  • 이유는 Hadoop!!
  • Hadoop이전의 분산처리고민해야 하는 것 일을 어떻게 분배해야 하는가? 프로그램을 어떻게 원격에 전송하나? 나눈 일의 스케쥴링은 어쩌지? 돌다가 실패한 작업은 어떻게 하지? 또~ 또~ @.@
  • Hadoop이후의 분산처리고민해야 하는 것 Map을 어떻게 짤까? Reduce를 어떻게 짤까?
  • 분산처리에 대한 기술장벽을 낮추었습니다.Hadoop이전 필요했던 개발자 Hadoop이후
  • 구텐베르크 할아버지(1398~1468) 금속 활판 인쇄술 지식의 대중 보급이 시작 (물론 우리도 직지심경있음)Hadoop이후 수많은 start-up과 기존 업체가 분산처리를 할 수 있게 됨 분산 병렬처리의 대중 보급
  • 하지만 Hadoop은 JAVA기반 다른 언어는 어쩌나요? HadoopStreaming STDIN/STDOUT을 이용한 데이터 스트리밍 = Python, Ruby등 어떤 언어로든 가능해짐
  • HadoopStreaming 에 집중한 업체 미국의 맛집 사이트 고객 로그와 평가에 기반한 추천 맛있다고 해서 가면 맛있음!!(놀라워!) 하루 로그 100GB
  • 이 회사 사람들은 Python 매니아. Hadoop도 쓰고 싶다. Python도 쓰고 싶다. 그럼 만들지 뭐~Siri on iphone4s
  • HadoopStreaming을 쉽게 쓰기 위한 Python Library mrJob https://github.com/Yelp/mrjob by
  • 반장의 단어 세기 프로그램 : 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() 를 세어요
  • 디버깅을 위해서, 굳이 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
  • 회사에 머신이충분히 없다면?
  • 사장님 분산처리하게컴퓨터 100대만 사주세요
  • 결제문서가 아니라 이력서를 쓰게 될 지도 모릅니다.
  • 사주셔도 문제사.. 사장님께서 사주셨어100대에 프로그램 설치해야 해 ㅠ.ㅠ
  • 그런 우리를 위해
  • 아마존이 제공하는 Hadoop 호스팅 서비스ElasticMapReduce http://aws.amazon.com/elasticmapreduce/
  • 아마존 님이OS에 Hadoop까지 설치해서대령해 주십니다.머신 안사도 됩니다. 쓴 만큼만 돈 내면 됨 Large Instance 기준 7.5G 메모리, 4 EC2 Compute Units 머신 100대를 1시간쓰는데  $ 6우리도 클라우드 유저!
  • 그리고 mrjob의 놀라운 기능$ python word_count.py data.txt --runner=local --output-dir=result$ export AWS_ACCESS_KEY_ID=~~~~$ export AWS_SECRET_ACCESS_KEY=~~~~$ python word_count.py data.txt --runner=emr --output-dir=s3://yongho/result runner만 바꾸면 아마존으로 전송되어 실행 됨!!!
  • Elastic MapReduce가제일 분산 규모가 크니까언제나 이걸로 하면 장땡인가요?답: 세상일이 그렇게 쉽지 않음.
  • no configs found; falling back on auto-configuration Job completed.using existing scratch bucket mrjob-2a2aa23a8d6b1931 Running time was 68.0s (not counting time spent waiting for theusing s3://mrjob-2a2aa23a8d6b1931/tmp/ as our scratch dir on S3 EC2 instances)Uploading input to s3://mrjob- Fetching counters...2a2aa23a8d6b1931/tmp/word_count.yongho.20111104.053927.13564 counters: [{File Systems: {Local bytes read: 341091,3/input/ Local bytes written: 682264,creating tmp directory 1MB 텍스트 단어세기 S3N bytes read: 170755,/var/folders/v2/t63rb7x54f53_9mx4hmw_xqc0000gn/T/word_count.yo S3N bytes written: 70720},ngho.20111104.053927.135643 Job Counters : {Launched map tasks: 2,writing master bootstrap script to Launched reduce tasks: 1,/var/folders/v2/t63rb7x54f53_9mx4hmw_xqc0000gn/T/word_count.yo Rack-local map tasks: 2},ngho.20111104.053927.135643/b.py Map-Reduce Framework: {Combine input records: 0,Copying non-input files into s3://mrjob- 세팅에 5분, 실행에 1분 Combine output records: 0,2a2aa23a8d6b1931/tmp/word_count.yongho.20111104.053927.13564 Map input bytes: 167508,3/files/ Map input records: 3735,Waiting 5.0s for S3 eventual consistency Map output bytes: 279513,Creating Elastic MapReduce job flow Map output records: 29460,Job flow created with ID: j-3BPUCHHQ1T5PC Reduce input groups: 6017,Job launched 32.2s ago, status STARTING: Starting instances Reduce input records: 29460, 자잘한 작업은 세팅하다 일 다봄Job launched 63.5s ago, status STARTING: Starting instances Reduce output records: 6017}}]Job launched 94.4s ago, status STARTING: Starting instances removing tmp directoryJob launched 125.3s ago, status STARTING: Starting instances /var/folders/v2/t63rb7x54f53_9mx4hmw_xqc0000gn/T/word_count.yoJob launched 156.4s ago, status STARTING: Starting instances ngho.20111104.053927.135643Job launched 187.2s ago, status STARTING: Starting instances Removing all files in s3://mrjob-Job launched 218.1s ago, status BOOTSTRAPPING: Running 2a2aa23a8d6b1931/tmp/word_count.yongho.20111104.053927.13564bootstrap actions 3/Job launched 249.1s ago, status BOOTSTRAPPING: Running Removing all files in s3://mrjob-2a2aa23a8d6b1931/tmp/logs/j-bootstrap actions 큼직한 일, 오래걸리는 일에 쓰자 3BPUCHHQ1T5PC/Job launched 280.0s ago, status RUNNING: Running step Terminating job flow: j-3BPUCHHQ1T5PC(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
  • REVIEWMultiprocessing module MultiCoreParallel PythonMapReduce Many MachinesmrJobElasticMapReduce Cloud
  • 문제의 크기를 잘 산정하고적절한 분산 규모를 택하고적절한 방법을 선택하세요
  • 그것이가장 최적의분산처리 방법입니다.
  • 감사합니다.클라우드연구소 / 분산기술 Lab / 하용호 wizfromnorth@paran.com @yonghosee