Monthly Archives: April 2011

hadoop 설치

1. masters 에는 secondary namenode 주소를
2. slave 에는 DataNode 주소를

fs.default.name
hdfs://masterip:9000

hadoop.tmp.dir
dir

dfs.name.dir
dir

dfs.data.dir
dir

dfs.replication
3

mapred.job.tracker
hdfs://masterip:9001

mapred.system.dir
dir/mapred/system

mapred.local.dir
dir/mapred/local

[책 리뷰] 만들면서 배우는 안드로이드 게임 프로그래밍

이 책은 “랜스의 게임공작소” 라는 유명 블로그를 운영하시는 랜스님이 쓰신 안드로이드 게임 프로그래밍 책입니다. 책 전체적으로 간단한 게임 프레임워크를 만들고 슈팅 게임을 만드는 것으로 마무리를 짓고 있습니다. 개인적으로 안드로이드에서 게임을 만들면 조금 느리지 않을까 생각했는데, 현재까지 나오는 프로그램들을 보면, 그런 걱정은 안해도 되는 것 같다라는 생각이 들었습니다.

이미 게임개발쪽을 아시는 분들은 윈도우에서 GDI 대신에 DX를 쓰듯이, 안드로이드에서 Draw 에 무엇을 써야할지, 그리고 입력 장치/오디오 장비들을 어떻게 관리해야 하는지만 아셔도 될듯합니다.

반대로, 처음 게임 개발에 관심을 가지시고 읽으시는 분들은 기본이 되는 실제 스프라이트를 어떻게 뿌릴 것인가? 슈팅 게임에서의 배경은 어떻게 움직이는 것이 효율적인지 등, 게임 개발 자체에 필요한 지식을 배울 수 있습니다.

그러나 전체적으로는 책 자체가 안드로이드 게임 개발에 들어가는 입문자를 위한 책입니다. 그러므로, 프로그래밍의 문법은 알고 있지만, 게임개발을 한번도 안해본 분에게 권장하고 싶은 책입니다. 입문자용 게임 개발 서적으로는 괜찮으듯 합니다. ^^

[책 리뷰] 영월드 라이징


영월드 라이징의 표지를 보면, 밑에 부제로 “중국은 이미 늙었다” 라는 문구가 눈에 띈다. 우리가 생각하기에 중국은 이제 세계 시장을 선도하는 세계 1~2위를 다투는 경제 대국이다. 특히 “Made in China” 없다면, 바로 전세계가 휘청거리게 만드는 그런 곳이다. 많은 인구와, 저렴한 노동력으로 세계를 호령하고 있는 중국이 이미 늙은 나라라니?, 그럼 어디가 좀 더 young 한 나라인 것일까? 이런 궁금중을 안겨주었다.

어떻게 보면 여기서의 Young 이라는 것은 아직 develeping 하고 있는 일종의 개발도상국을 말할 수 도 있다. 역시 책에서 소개하는 나라들도 실제로, 인도부터 시작해서, 아프리카 들을 위주로 소개하고 있다. 영월드(YoungWorld) 라고 해서 나라에만 주목할 수 있지만, 책의 첫 부분에서는 “디지털 네이티브” 시대에 대해서 주목하고 있다. 한때, 우리나라가 그랬던 것들 처럼, 여기의 영월드의 젊은 디지털 네이티브 세대들은 이미 다른 선진국들의 젊은 세대와 같은 수준으로 인터넷을 이용하고 뛰어난 개발능력을 보여주고 있다.

즉, 영월드의 젊은 세대들은 이미 다른 곳과 동일한 기술력을 가진 채로, 저렴한 임금으로 이제 다른 수많은 기업들을 위협할 수 있는 새로운 경쟁자들인 것이다. 빌게이츠나 구글, 페이스북에서 두려워하는 사람들은 이미 성장한 다른 기업들이 아니라, 지금 차고에서 무언가를 하고 있는 사람들이라고 한 적이 있다. 즉, 새로운 뭔가를 들고 나타날 이런 기업들이 앞으로 영월드에서 많이 나타나지 않을까 라는 생각이 든다.

이제 우리나라에서도 기업을 만드는 사람들이 꼭, 우리나라만이 아닌, 인도나, 그 외의 다른 나라에서 언어만 소통이 된다면, StartUp을 시작하는 것은 어떨까? 이스라엘 에는 인터넷이 우리나라만큼 발달하지는 않았지만, 클라우드나 보안쪽에 수많은 기술력을 가진 회사들이 많이 모여있다고 한다. 사람만 있다면, 어느 나라에서 기업을 하더라도 이제 점점 덜 중요한 시대가 오는 것 같다. 그리고 우리의 경쟁자들이 앞선 나라들이 아니라 이제 점점 발전하는 영월드라는 걸 깨닫게 해준 책이다.

[Refactoring] Decompose Conditional, Consolidate Conditional Expression, Consolidate Duplicate Conditional Fragments

Mongodb Building for Windows With VC10

Mongodb 의 Windows 에서의 빌드 방법입니다.

일단 제 목표는 Mongodb의 소스 디버깅이므로 디버그 위주로 설명합니다. 조금만 손대면
Release도 가능하겠죠 ^^

(개인적으로 디버깅 환경 자체는 VC++ 이 좋다고 생각하는 사람입니다.)
사실 이것만 봐도 되긴합니다.

http://www.mongodb.org/display/DOCS/Building+for+Windows

1. mongodb 다운로드 -> http://www.mongodb.org
2. boost 다운로드 및 빌드
-> 귀찮으니 그냥 prebuilt 모듈을 사용하면됩니다.
-> http://www.mongodb.org/pages/viewpageattachments.action?pageId=12157032
3. spidermonkey 다운로드 및 빌드
-> https://github.com/dwight/vc2010_js
-> mongodb는 BSON(Binary Json)을 사용합니다. 이를 위해 자바스크립트 엔진으로 SpiderMonkey를 사용합니다.
-> 구글 쪽 v8이던가를 쓰면 더 괜찮지 않을까 라는 생각만 있습니다.

4. 환경 설정
-> db/db_10.sln 을 오픈합니다.
-> include 폴더에 boost 와 spidermonkey의 헤더가 가도록 설정합니다.
-> lib 폴더에 boost 라이브러리가 셋팅되도록 합니다.
-> spidermonkey 라이브러리는 소스보다 상위에 ../js/ 를 만들어서 4개의 파일을 넣어줍니다.

5. 그리고 빌드하면 끝
-> 결과물은 db/Debug 안에 들어갑니다. 물론 Debug로 빌드할 때입니다.

Simple Python Twitter api example

책에 있는 예제입니다.

import twitter
import os
import sys
import json

twitter_search = twitter.Twitter(domain="search.twitter.com",secure=None)
trends = twitter_search.trends()
print [ trend['name'] for trend in trends['trends'] ]

search_results=[]
for page in range(1,2):
    search_results.append( twitter_search.search(q="SNL", rpp=100, page=page) )
#   print json.dumps(search_results, sort_keys=True, indent=1)

tweets = [ r['text'] 
    for result in search_results 
        for r in result['results'] ]

#print tweets

words = []
for t in tweets:
    words += [ w for w in t.split() ]

print len(words)
print len(set(words))

print 1.0*len(set(words))/len(words)
print 1.0*sum([ len(t.split()) for t in tweets ])/len(tweets)

import nltk

freq_dist = nltk.FreqDist(words)

import re
rt_patterns = re.compile(r"(RT|via)((?:bW*@w+)+)", re.IGNORECASE)
for t in tweets:
    print rt_patterns.findall(t)

별 도움 안되는 Server Modeling with Mysql

Hadoop 에서 Secondary Namenode 의 역활

Hadoop 에는 NameNode 와 Secondary NameNode 라는 게 있습니다. 일반적인 생각은 아 Master NameNode 가 죽으면, Secondary NameNode 가 Active-Standby 형태로 동작하지 않을까? 라고 희망을 가지게 됩니다. 하지만, 현재까지의 Hadoop 에서는 그런 멋진 기능은 제공하지 않습니다.(facebook 에서 avatar node 라고 해서 이런걸 제공할려고 하고 있습니다.)

그럼, Secondary Namenode 는 무슨 역할을 하는가? 라는 의문이 생기게 됩니다. 정확하게 얘기를 하자면 SNN의 역할은 백업 용도입니다. 하지만, Master Namenode 즉 NN의 운영에 도움을 줍니다. 라고 말할 수 있습니다.

SNN이 fsimage 와 edits.new 를 일정시간 마다 merge 하고 이를 다시 NN에게 전달하기 때문입니다. 여기서 fsimage 는 NN의 메모리 상태를 가지고 있는 파일입니다. edits.new는 변경 사항을 가지고 있는 log 파일이라고 보면 될듯 합니다. 이때 SNN이 fsimage와 edits.new를 병합해서 NN으로 던져주지 않으면, NN에 계속 edits.new가 커지게 되어서, 결국 edits.new가 메모리 사이즈 보다 커지게 되면, 재시작시에 문제가 발생할 수 있습니다.

http://www.jaso.co.kr/279 를 보시면 이에 대한 내용이 잘 나와있습니다. ^^

간단하게 소스를 따라가자면
src/java/org/apache/hadoop/hdfs/server/namenode/SecondaryNameNode.java

를 보면 doWork 라는 함수가 있습니다. doWork 에서 doCheckpoint() 를 호출하게 됩니다.

  public void doWork() {

    //
    // Poll the Namenode (once every 5 minutes) to find the size of the
    // pending edit log.
    //
    long period = 5 * 60;              // 5 minutes
    if (checkpointPeriod = checkpointSize ||
            now >= lastCheckpointTime + 1000 * checkpointPeriod) {
          doCheckpoint();
          lastCheckpointTime = now;
        }
      } catch (IOException e) {
        LOG.error("Exception in doCheckpoint: ");
        LOG.error(StringUtils.stringifyException(e));
        e.printStackTrace();
        checkpointImage.getStorage().imageDigest = null;
      } catch (Throwable e) {
        LOG.error("Throwable Exception in doCheckpoint: ");
        LOG.error(StringUtils.stringifyException(e));
        e.printStackTrace();
        Runtime.getRuntime().exit(-1);
      }
    }
  }

여기서 다시 namenode.rollFsImage(sig)로 호출하게 됩니다.

  boolean doCheckpoint() throws IOException {

    // Do the required initialization of the merge work area.
    startCheckpoint();

    // Tell the namenode to start logging transactions in a new edit file
    // Returns a token that would be used to upload the merged image.
    CheckpointSignature sig = namenode.rollEditLog();

    // error simulation code for junit test
    if (ErrorSimulator.getErrorSimulation(0)) {
      throw new IOException("Simulating error0 " +
                            "after creating edits.new");
    }

    boolean loadImage = downloadCheckpointFiles(sig);   // Fetch fsimage and edits
    doMerge(sig, loadImage);                   // Do the merge

    //
    // Upload the new image into the NameNode. Then tell the Namenode
    // to make this new uploaded image as the most current image.
    //
    putFSImage(sig);

    // error simulation code for junit test
    if (ErrorSimulator.getErrorSimulation(1)) {
      throw new IOException("Simulating error1 " +
                            "after uploading new image to NameNode");
    }

    namenode.rollFsImage(sig);
    checkpointImage.endCheckpoint();

    LOG.warn("Checkpoint done. New Image Size: "
             + checkpointImage.getStorage().getFsImageName().length());

    return loadImage;
  }

중요한 의문중에 하나는 SNN이 merge 해서 NN에 sync 하게 되면 NN이 다시 이를 재로딩 하는가? 였는데, 그러지는 않고, 그냥 백업 용도로만 저장이 되니다. hadoop 이 내려갔다가 다시 올라올 때, 이 fsimage 와 edits.new 를 다시 병합해서 메모리에 적재하게 됩니다.

관련해서 인터넷 검색에서 좋은 이미지가 나와서 링크합니다. 출처는 여기입니다.

http://datasearch.ruc.edu.cn/~boliangfeng/blog/?p=551

제가 까먹을까 봐서 정리했고 많은 도움 주신 클라우드 컴퓨팅 구현 기술 그룹분들께 감사드립니다. cloudtech@groups.facebook.com

Facebook Online Schema Change for MySQL And Alter table Speed

NoSQL을 선택하는 비중이 큰 이유중에 하나는 Schema Free 라는 겁니다. 그리고 이에 비교하는 것으로 나오는 것이 RDBMS 에서 alter table 의 문제입니다. alter table 하는 동안에 데이터를 변경하지 못하는 것은 아니지만, 어떤 문제가 생길지도 모르고, 또한 이로 인해 서비스 속도가 줄어드는 이슈가 발생합니다.

이로 인해 첫번째 해결 책은 바로 “점검 시간” 입니다. 포털쪽보다, 게임쪽에서 더 자주 사용하는 신공으로 아예 해당 서비스를 그 시간동안 접습니다. 서버도 리부팅 해주고, DB도 옵티마이징 해주고, 보통은 예상시간 보다 더 걸리게 되는 천하제일신공이지요.

그런데, Facebook 이나 와우의 블리자드 같은 경우는 이런 문제를 다른 방법으로 해결합니다. 바로, 실시간 체인지입니다. 즉, 새로운 업그레이드 버전으로 서버를 구성해두고, 특정시간 부터는 바로 여기로 보내버립니다. 간단하게 생각할 때, 하드웨어가 2배로 들어갑니다. 그렇습니다. 돈 없는 회사는 쓰기 힘듭니다. 서비스 점검 시간보다 하드웨어 비용이 쌀 때나 시도해 볼 수 있는 신공이지만, 그러나, 서비스 유지가 정말 중요할 때는 훨씬 유용할 듯 합니다.

다음 사이트에 facebook에서 사용하는 방법이 나와있습니다.

http://www.facebook.com/notes/mysql-at-facebook/online-schema-change-for-mysql/430801045932

간단하게 요약하면
1. Data Dump
2. Change Schema
3. Sync Data
4. Replace

입니다.

그런데 이 걸 보다 보니, 데이터 alter table 을 할 때( 정확하게 말하자면 보통 요구사항의 증가로 인한 alter table add column 입니다. ) 시간이 얼마나 걸릴 것인지 궁금해 졌습니다.

그래서 약 2500만건 정도의 Dummy 데이터를 생성한 다음 alter table을 적용했습니다.

테스트 머신
CPU: Quard Xeon 3.6GH
MEM: 4G

alter table dummy add column test_dummy varchar(255) , add index(test_dummy) 했을 때 innodb 에서 대략 23분 정도 걸렸습니다.

제 예상은 굉장히 오래 걸릴꺼라고 생각했는데, 생각보다 빠른 시간에 굉장히 놀라웠습니다.( 그럼 페이스북 이런데서는 과연 몇시간씩 걸릴려면 몇억, 몇십억 몇조 까지도 가지 않을까 하는 생각이 듭니다.)

하지만, 이렇게 미리 준비하는 것의 이점은, 서버 점검 시간이 길어지는 걸 방지해준다라는 장점이 하나 더 있습니다. alter table 중에 뭔가 장애가 발생하더라도 서비스가 멈춰있지 않기 때문에, 재시도 할 수 있는 시간이 충분히 생깁니다.

뭐, 이런 저런 생각을 하더라도, 돈만 있으면 서버 2배로 늘리고 하는 것도 재미있을듯 합니다.

Google App Engine: DataStore

일단 1차 정리 버전입니다. 만들다 보니 웬만한 책보다는

http://code.google.com/appengine/docs/

여기가 훨씬 내용이 좋네요.

그냥 만들다가 좌절했습니다.

Follow

Get every new post delivered to your Inbox.

Join 29 other followers