'파이썬'에 해당되는 글 2건

  1. 2016.01.15 하둡 스트리밍을 활용한 파이썬 word counting 예제~
  2. 2012.02.06 [도서] GAE로 시작하는 클라우드 컴퓨팅 - 구글 앱 엔진 활용하기

하둡 스트리밍을 활용한 파이썬 word counting 예제~

|



하둡 스트리밍을 활용하면 맵리듀스 잡을 실행가능한 스크립트, 쉘 프로그래밍/파이썬/자바/R 등으로 처리할 수 있다. 

하둡 스트리밍에 대해서는 Apache Hadoop Streaming을 참고하면 된다. 


이번 강의에서는 기본 하둡 예제인 Word Count를 파이썬으로 구성한 후, 하둡 스트리밍으로 맵리듀스를 적용하는 예제를 살펴보기로 한다. 

하둡 스트리밍 명령어는 다음과 같이 사용법을 확인할 수 있다. 

> hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar --help


1. 먼저 파이썬으로 맵 함수를 만들어 보자. 

WordCount에서 맵 함수는 파일의 각 라인별로 읽어서 공백으로 자른 다음, Key: 단어, Value: 1로 출력하면 된다. 

> gedit wordcount_mapper.py

#!/usr/bin/env python

import sys

for line in sys.stdin:
    line = line.strip()
    keys = line.split()

    for key in keys:
        value = 1
        print('{0}\t{1}'.format(key, value) )


2. 이어서 파이썬으로 리듀스 함수를 만들어 보자. 

리듀서로 넘어올 때는 이미 정렬과 그룹핑이 되어 있기 때문에 키 값인 단어를 이전과 비교해서 총합을 구하면 된다. 

> gedit wordcount_reducer.py

#!/usr/bin/env python

import sys

last_key = None
running_total = 0

for input_line in sys.stdin:
    input_line = input_line.strip()

    this_key, value = input_line.split("\t", 1)
    value = int(value)

    if last_key == this_key:
        running_total += value

    else:
        if last_key:
            print( "{0}\t{1}".format(last_key, running_total) )
        running_total = value
        last_key = this_key

if last_key == this_key:
    print( "{0}\t{1}".format(last_key, running_total))


3. 작성한 파이썬 소스코드를 실행가능한 모드로 변경한다. 

> chmod +x wordcount_mapper.py
> chmod +x wordcount_reducer.py
> ls


4. Word Count를 테스트할 파일을 생성한다. 

> echo "A long time ago in a galaxy far far away" > /home/cloudera/testfile1
> echo "Another episode of Star Wars" > /home/cloudera/testfile2


5. 생성한 테스트 파일을 하둡 파일 시스템에 올린다. 

만약 이전 강의를 따라하면서 똑같은 파일명이 있다면 해당 파일을 먼저 지우고 올리면 된다. 

> hdfs dfs -mkdir /user/cloudera/input
> hdfs dfs -put /home/cloudera/testfile1 /user/cloudera/input
> hdfs dfs -put /home/cloudera/testfile2 /user/cloudera/input
> hdfs dfs -ls /user/cloudera/input


6. 하둡 스트리밍을 활용하여 생성한 테스트 파일 기반으로 파이썬 맵퍼와 리듀서를 실행한다. 

> hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar \
  -input /user/cloudera/input \ 
  -output /user/cloudera/output_new \
  -mapper /home/cloudera/wordcount_mapper.py \
  -reducer /home/cloudera/wordcount_reducer.py


7. 결과를 확인하면 테스트 파일의 단어와 개수가 정렬되어 있는 것을 볼 수 있다. 

> hdfs dfs -cat /user/cloudera/output_new/part-00000
> hdfs dfs -ls /user/cloudera/output_new


8. 이번에는 리듀스를 포함하지 않고 적용해보자. 마지막에 numReduceTasks를 0으로 세팅했다. 

> hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar \
  -input /user/cloudera/input \
  -output /user/cloudera/output_new_0 \
  -mapper /home/cloudera/wordcount_mapper.py \
  -reducer /home/cloudera/wordcount_reducer.py \
  -numReduceTasks 0


9. 결과를 살펴보면 다음과 같이 세 개의 파일로 나누어져 있는 것을 확인할 수 있다. 

또한 리듀서를 적용하지 않았기 때문에 동일한 단어에 대해서 개수를 통합하지 못한 것을 far를 보면 알 수 있다. 

> hdfs dfs -ls /user/cloudera/output_new_0
> hdfs dfs -cat /user/cloudera/output_new_0/part-00000
> hdfs dfs -cat /user/cloudera/output_new_0/part-00001
> hdfs dfs -cat /user/cloudera/output_new_0/part-00002


10. 여러개의 파일로 결과가 나올 경우, getmerge를 통해 하나의 파일로 합쳐서 로컬에 가져올 수 있다. 

> hdfs dfs -getmerge /user/cloudera/output_new_0/* wordcount_num0_output.txt
> ls
> cat wordcount_num0_output.txt


11. 만약 numReducerTasks를 2로 설정하면 어떻게 될까? 

참고로 맵리듀스 결과가 저장될 곳을 기존 디렉토리를 지정하면 이미 파일이 존재한다는 에러가 난다. 

> hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar \
  -input /user/cloudera/input \
  -output /user/cloudera/output_new_1 \
  -mapper /home/cloudera/wordcount_mapper.py \
  -reducer /home/cloudera/wordcount_reducer.py \
  -numReduceTasks 2


12. 리듀서를 2개를 사용하면 결과값이 글로벌하게 정렬되지 않는 점을 제외하고는 Word Count는 제대로 실행되는 것을 확인할 수 있다. 

> hdfs dfs -ls /user/cloudera/output_new_1
> hdfs dfs -cat /user/cloudera/output_new_1/part-00000
> hdfs dfs -cat /user/cloudera/output_new_1/part-00001


본 강의의 예제는 University of California, San Diego의 폴 로드리게즈(Paul Rodriguez) 교수의 자료를 참고했다. 




Trackback 0 And Comment 0

[도서] GAE로 시작하는 클라우드 컴퓨팅 - 구글 앱 엔진 활용하기

|



구글 앱 엔진 활용하기 - 8점
찰스 세브란스 지음, Software in Life 옮김/지&선(지앤선)

클라우드 컴퓨팅의 PaaS(Platform as a Service)의 대표인 구글 앱 엔진에 대해 다룬 책으로 관심있게 읽어봤습니다. 
기본적인 GAE(Google App Engine)의 설치나 서버에 적용하는 방법등은 짧지만 이해하기 쉽게 설명되어 있습니다.

그러나 이 책이 매우 맘에 들었던 가장 큰 이유는 
하나의 흐름을 가지고 Google App Engine 뿐만 아니라 해당 엔진을 활용한 웹 프로그래밍에 대해서 전반적으로 잘 설명하고 있다는 점입니다. 

웹프로그래밍 개요, HTML과 CSS, Python, Ajax 등 기본적인 내용이지만
구글 앱 엔진에 적용하기 위해서 반드시 알아야 하는 부분들에 대해 요약해서 잘 설명하고 있는 것 같습니다.

여기에 구글 엡 엔진의 프레임워크, 템플릿, 쿠키와 세션 처리, 그리고 데이터스토어에 대해서도 예제를 통해 살펴볼 수 있도록 구성되어 있습니다.

일단 구글 앱 엔진이 어떤 형태로 구성되어 있는지 이해하게 되었고,
더 나아가 이런 형태로 하나의 예제로 쭉 강의를 한다면 처음 웹 프로그래밍을 접하는 사람들이 이해하는데 도움이 되겠다는 생각도 들었네요. 

최근 구글앱엔진에서 java도 지원하는 것으로 알고 있는데요. 
클라우드 환경으로 이동하면서 Google App Engine이나 MS Azure와 같은 PaaS에도 관심을 가져야 하지 않을까 합니다. 
http://code.google.com/intl/ko-KR/appengine/ 

항상 그렇듯 책으로 배우는 것은 기본적인 개념이라고 봐야 하구요. 
세부적인 사항은 구글 앱 엔진 사이트의 문서들을 참고해서 프로그래밍을 해야겠지요.  

구글 앱 엔진의 최대 장점은 세계 곳곳에 위치한 구글 최고의 데이터센터에서 서비스를 운영할 수 있다는 점입니다.
앱 엔진 애플리케이션을 만들고 배치하고 나면 다음과 같이 말할 수 있다고 하네요.. ^^

My other computer is a data center.
My other computer is somewhere in one or more world-class data centers scattered around the world.

책 내용을 살펴보면 먼저 HTML에 대한 이야기로 시작합니다. 

요즘은 XHTML과 같이 HTML 규약에 적합한 표준 문서를 만드는게 중요하지만, 예전에는 대충 HTML 만들어도 브라우저에서 동작하기는 했었죠.
오히려 이런 점이 초기 HTML 툴이나 개발자들에게는 지금에 와서 표준을 지켜야 한다는 어려움을 주기도 합니다. ㅠㅠ
이처럼 결함이 있거나 불완전한 HTML을 만나면 브라우저는 쿼크 모드 (Quirks Mode)로 들어가 브라우저마다 다른 결과를 보내준다고 합니다. 
그러므로 well-formed HTML 문서를 만드는 것이 웹 프로그래밍에서 첫번째로 가장 중요하겠죠.. 

CSS에 대해서도 제법 상세하게 이야기 합니다.
CSS의 유효성을 검사할 수 있는 CSS Validation Service(http://jigsaw.w3.org/css-validator/)에 대한 소개와 더불어 
책의 메인 예제로 사용되는 HTML에 대한 기본적인 CSS를 통해 각 항목을 상세히 설명하고 있습니다. 

저도 일부분을 참고해서 정리를 하나 하기는 했네요.. ^^
2012/01/20 - [프로그래밍/Web] - CSS의 Margin, Padding, Border 개념을 명확하게 하자

구글 앱 엔진은 파이썬 2.5 이상에서 동작하는데요. 
기존의 다른 언어를 해 보신 분들이라면 파이썬의 기본 구문만 이해하면 쉽게 할 수 있을 것이라 생각합니다.
특히 파이썬은 들여쓰기를 사용해서 블록을 구분하는 독특한 문법을 사용하고 있으므로 코드 작성 스타일을 반드시 지켜야 한다고 하네요

웹 프로그래밍에서 MVC 모델이 보편화되면서 유지보수 등을 위해 대부분 템플릿이라는 것을 활용하게 됩니다. 
구글 앱 엔진에서 기본적으로 사용하는 템플릿 문법은 Django 프로젝트(http://www.djangoproject.com/)에서 차용했다고 합니다. 

책의 예제에 기반해서 계속적으로 새로운 기능을 추가하려면 다음과 같은 과정을 이야기 하고 있습니다. 
  • 새로운 기능을 위한 URL을 결정하자.
  • 새로운 핸들러를 만든다. 먼저 GET 방식의 요청을 받아 새로운 템플릿을 적용하는 간단한 작업부터 시작한다. 
  • URL을 새로운 핸들러로 처리하기 위해 main()에 새로운 라우팅 항목을 만든다.
  • 필요한 템플릿들을 추가한다. 
  • 새로운 네비게이션 메뉴가 필요하면 _base.html에서 수정한다. 
  • 핸들러의 나머지 부분을 만들고 새 기능을 테스트한다. 

그리고 쿠키와 세션을 사용하는 방법에 대해서도 이야기 하고 있는데요. 
구글 앱 엔진에서는 세션 기능을 제공하지 않기 때문에 세션 유틸리티를 다운로드 해서 추가해 줘야 한다고 합니다. 

데이터 저장소를 위해서는 NoSQL을 지원하는 구글의 빅테이블(Bigtable) 기술을 기반으로 한 구글 데이터스토어를 활용해야 합니다. 
Development Console의 Datastore Viewer를 통해 데이터를 직접 관리할 수도 있구요. 
책의 예제에 데이터스토어에 저장, 쿼리, 데이터 추출 등에 대해 설명되어 있고  특히 RDB의 foreign key와 같은 참조 처리(ReferenceProperty)에 대해서도 설명되어 있으니  참고해 보시기 바랍니다. 
구글의 빅테이블을 조금이라도 맛볼 수 있는 부분이 아닌가 생각됩니다. 

그밖에도 구글의 사용자 API(User API)를 활용하여 구글 계정을 통해 인증할 수 있는 방법, 메모리 캐시에 대해서도 간략하게 설명만 되어 있네요. 
구글 앱 엔진의 개발자 가이드의 API를 보면 이러한 것들이 잘 포함되어 있으니 참고하시기 바랍니다. 

개발자 가이드

Google 애플리케이션 엔진에 오신 것을 환영합니다. 이 개발자 가이드에는 Google 기술을 사용하여 확장 가능한 웹 응용프로그램을 작성하기 위해 필요한 모든 내용이 들어 있습니다.

이 가이드는 다음과 같은 내용으로 구성되어 있습니다.



 



Trackback 0 And Comment 0
prev | 1 | next