우분투에서 기본으로 제공해주는 OpenJDK 가 있지만, OracleJDK가 필요할 때가 있다.

이전에는 우분투에서 OracleJDK Repository가 기본으로 제공되어 apt-get으로 쉽게 설치가 가능하였지만, 이제는 더이상 지원하지 않기때문에 다른 방법을 찾아야 한다. 몇군데 찾아보다 보았더니 OracleJDK 설치를 어렵지 않게 할 수 있었다

오늘은 쉽고 빠른 OracleJDK설치에 대해 설명해 보겠다.


PPA등록으로 빠른 설치하기.

1. 새로운 repository PPA를 추가

$ sudo add-apt-repository ppa:webupd8team/java

2. repository index 업데이트

$ sudo apt-get update

3. JDK설치

- Java 8

$ sudo apt-get install oracle-java8-installer

- Java 7

$ sudo apt-get install oracle-java7-installer

4. 설치된 Java version 확인

$ java -version
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)


수동 설치하기

1. OS 및 커널 bit 확인

$ file /sbin/init
/sbin/init: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=7a4c688d009fc1f06ffc692f5f42ab09e68582b2, stripped

2. Java 정보 확인

$ java -version
java version "1.7.0_79"
OpenJDK Runtime Environment (IcedTea 2.5.5) (7u79-2.5.5-0ubuntu0.14.04.2)
OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)

3. 다른 Vendor와 충돌 방지를 위하여 OpenJDK 삭제

$ apt-get purge openjdk*

4. OracleJDK 바이너리를 저장할 폴더 생성

$ sudo mkdir -p /usr/local/java

5. OracleJDK 바이너리 다운로드

OracleJDK 7 다운로드

OracleJDK 8 다운로드

6. 다운로드한 압축파일 풀기

- Java 8

$ cp -r ~/Download/jdk-8u45-linux-x64.tar.gz /usr/local/java/
$ cd /user/local/java
sudo tar xvzf jdk-8u45-linux-x64.tar.gz

- Java 7

sudo cp -r ~/Download/jdk-7u79-linux-x64.tar.gz /usr/local/java/
$ cd /user/local/java
sudo tar xvzf jdk-7u79-linux-x64.tar.gz

7. 시스템 PATH 파일 수정 후 저장

- Java 7

$ sudo vi /etc/profile

JAVA_HOME=/usr/local/java/jdk1.7.0_79
JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME
export JRE_HOME
export PATH

- Java 8

$ sudo vi /etc/profile

JAVA_HOME=/usr/local/java/jdk1.8.0_20
JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
export JAVA_HOME
export JRE_HOME
export PATH

8. /etc/profile 리로드

$ sudo source /etc/profile

9. 시스템에 Oracle Java 사용 알리기

시스템에 Oracle Java JRE 사용 알리기

$ sudo update-alternatives --install "/usr/bin/java" "java" "/usr/local/java/jdk1.7.0_79/bin/java" 1
update-alternatives: using /usr/local/java/jdk1.7.0_79/bin/java to provide /usr/bin/java (java) in 자동 모드

시스템에 Oracle Java JDK 사용 알리기

$ sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/local/java/jdk1.7.0_79/bin/javac" 1
update-alternatives: using /usr/local/java/jdk1.7.0_79/bin/javac to provide /usr/bin/javac (javac) in 자동 모드

시스템에 Oracle Java Web 사용 알리기

$ sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/local/java/jdk1.7.0_79/bin/javaws" 1
update-alternatives: using /usr/local/java/jdk1.7.0_79/bin/javaws to provide /usr/bin/javaws (javaws) in 자동 모드

10. OracleJDK Default로 지정하기

$ sudo update-alternatives --set java /usr/local/java/jdk1.7.0_79/bin/java
$ sudo update-alternatives --set javac /usr/local/java/jdk1.7.0_79/bin/javac
$ sudo update-alternatives --set javaws /usr/local/java/jdk1.7.0_79/bin/javaws

11. Java 버전 확인하기 

$ java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)


Java 관리하기

여러 버전의 Java가 설치 되어있는 경우, Default로 사용할 버전을 선택하여 사용할 수 있다.

$ sudo update-alternatives --config java

대체 항목 java에 대해 (/usr/bin/java 제공) 2개 선택이 있습니다.
  선택       경로                                        우선순위      상태
--------------------------------------------------------------------------

* 0   /usr/lib/jvm/java-7-oracle/jre/bin/java           1073      자동 모드
  1   /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java    1071      수동 모드
  2   /usr/lib/jvm/java-7-oracle/jre/bin/java           1073      수동 모드

기본 사항[*]을 사용하려면 엔터, 다른 것을 사용하려면 번호를 입력하십시오: 


이제 우분투에서 OracleJDK를 사용할 수 있게 되었다. 

오늘의 포스팅은 여기서 끝~

참고 자료 : 

https://www.digitalocean.com/community/tutorials/how-to-install-java-on-ubuntu-with-apt-get

http://www.wikihow.com/Install-Oracle-Java-JDK-on-Ubuntu-Linux

Posted by 알 수 없는 사용자
,

Storm-ESPER는 Storm과 ESPER를 이용한 실시간 데이터 처리 엔진이다. 

Storm-ESPER에 대해 궁금하다면, 엠비안에서 진행했던 Strom-ESPER 프로젝트의 Prototype과 테스트에 대한 블로그에서 참조 할 수 있다. (Storm & Esper Prototype 및 Test)

Storm-ESPER 프로젝트를 받았을 때, 프로젝트에 대한 프로토타입 테스트 결과문서, 설치문서, 설치 패키지가 존재하였다. 하지만 패키지와 문서가 CentOS를 위한 것이었기 때문에, 내 작업환경인 Ubuntu에서 실행되지 않았다. 그리하여 Storm-ESPER실행을 위한 각 모듈을 따로 컴파일하여 실행시켜줘야하는 번거로움이 있었다. 그뿐만 아니라 실행하는 과정에서 컴파일러 버전이 맞지 않거나 실행에 필요한 jar파일들이 없어서 고생하기도 했다. 

이러한 실행의 어려움을 해소하기 위해, Storm-ESPER 실행방법을 자세히 설명해 보도록 하겠다. 

모든 설치 및 실행방법은 Ubuntu시스템 기준으로 설명한다.


Storm-ESPER 실행전 필요조건 1 - 필요한 프로그램 설치

1. zookeeper-3.4.6

압축파일을 미러에서 받은 후 압축을 푼다.

$ wget http://mirrors.ukfast.co.uk/sites/ftp.apache.org/zookeeper/stable/zookeeper-3.4.6.tar.gz  
$ tar -xvf zookeeper-3.4.6.tar.gz  

config 파일을 생성한다. 

$ vi conf/zoo.cfg

# The number of milliseconds of each tick  
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181

Zookeeper를 실행한다.

$ ~/zookeeper-3.4.6/bin/zkServer.sh start

2. RabbitMQ Server

RabbitMQ는 repository에서 설치할 수 있다.

$ apt-get install rabbitmq-server

 WebUI Admin plugin을 설치하여 모니터링을 할 수 있게 한다. 플러그인 설치 후 리스타트를 해준다.

$ rabbitmq-­plugins enable rabbitmq_management 
service rabbitmq­-server restart

3. Apache Storm 0.9.4

압축파일을 미러에서 받은 후 압축을 푼다. (이번 테스트에서 사용한 Storm버전은 0.9.4이다.)

$ wget http://mirror.apache-kr.org/storm/apache-storm-0.9.4/apache-storm-0.9.4.tar.gz 
$ tar -xvf apache-storm-0.9.4.tar.gz

conf 파일을 변경해준다.

 $ vi ~/apache-storm-0.9.4/conf/storm.yaml

########### These MUST be filled in for a storm configuration
 storm.zookeeper.servers:
    - zookeeper가 설치되어있는 호스트 ip
#     - "localhost"

 nimbus.host: nimbus가 설치되어있는 호스트 ip


Storm-ESPER 실행전 필요조건 2 - 파일수정 및 Storm 실행

1. conf 파일 수정 및 라이브러리 파일 추가

먼저 Storm-ESPER를 컴파일하기 전에  conf파일을 수정해야한다. "storm-esper"프로젝트의 conf폴더에 있는 yaml파일들을 조건에 맞게 수정해 준다. 아래의 예시를 따라서 본인의 ip를 사용하면 된다.

~/storm-esper/trunk/conf/deploy.yaml

~/storm-esper/trunk/conf/nimbus_conf.yaml


~/storm-esper/trunk/conf/supervisor_conf.yaml

~/storm-esper/trunk/conf/esper_supervisor_conf.yaml


EPL명령어 제어를 위한 "storm-esper-client" 프로젝트의 conf폴더의 conf.yaml파일을 수정해 준다.

~/storm-esper-client/trunk/conf/conf.yaml

rabbitmq.server.queue.name: "cmd_queue"
rabbitmq.server.queue.ip: "192.168.0.28"
rabbitmq.server.username: "guest"
rabbitmq.server.userpass: "guest"

2. pom.xml 파일 수정 

"storm-esper" 프로젝트의 pom.xml을 다음과 같이 수정해준다.

기존 코드:
  <dependency>
    <groupId>storm</groupId>
    <artifactId>storm</artifactId>
    <version>0.8.2</version>
    </dependency>

수정 코드:
    <dependency>
    <groupId>org.apache.storm</groupId>
    <artifactId>storm-core</artifactId>
    <version>0.9.4</version>
    </dependency>


3. jar파일 추가

Storm-ESPER엔진을 실행하기 전에 custom scheduler로 EsperBolt를 특정 supervisor(esper-supervisor)에 할당하기 위하여 Nimbus용 jar파일을 생성하여 Storm 라이브러리에 위치시켜야 한다. 또한, Storm-ESPER연동을 위하여 Esper와 RabbitMQ  라이브러리를 Storm 라이브러리에 복사하여야 한다.

Apache Storm 0.9.4가 설치되어있는 폴더 내 lib 폴더에 라이브러리 파일을 추가하는 법은 아래와 같다. 

1. "storm-esper-scheduler"프로젝트를 컴파일 하여 jar파일 생성 및 라이브러리 파일 복사

$ cd ~/storm-esper-scheduler/trunk
$ mvn clean dependency:copy-dependencies install
$ cd target
$ cp storm-esper-scheduler-0.0.1.jar ~/apache-storm-0.9.4/

2. "storm_esper" 프로젝트를 컴파일 하여 dependency jar파일 생성 및 라이브러리 파일 복사

$ cd ~/storm_esper/trunk
$ mvn clean dependency:copy-dependencies install
$ cd target/dependency
$ cp amqp-client-3.1.4.jar cglib-nodep-2.2.jar antlr-runtime-3.2.jar esper-4.10.0.jar ~/apache-storm-0.9.4/lib/

4. Storm실행

이제 Storm을 실행할 준비가 되었다. 아래의 명령어로 Storm을 실행한다. 테스트용 실행방법이므로 Nimbus, Supervisor, UI를 전부 한대의 머신에서 실행해 보겠다. 

$ ~/apache-storm-0.9.4/bin/storm nimbus &
$ ~/apache-storm-0.9.4/bin/storm supervisor &
$ ~/apache-storm-0.9.4/bin/storm ui &


Strom-ESPER 실행



<그림 1. Storm-ESPER 동작 구성도>


1. DataThrower

테스트용 더미 데이터를 DataThrower를 사용하여 RabbitMQ에 전송해야 한다. 더미 데이터는 DataThrower프로젝트를 컴파일하여 생성된 jar파일을 실행하여 "in_queue"에 전송한다. 이때 throw.conf파일의 "inqueueName":"in_queue"로 수정해준다.

$ java -cp ~/maven_data/trunk/target/maven_data-0.0.1-SNAPSHOT.jar com.embian.maven_data.tester.DataThrower ~/maven_data/conf/throw.conf >> ~/maven_data/logs/throw.log

2. submit topology

"storm-esper"프로젝트를 컴파일하여 생성된 토폴로지를 스톰에 올려주는 스크립트를 실행한다.

$ sh ~/storm_esper/trunk/etc/submit_topology.sh

3. EPL command 실행

"storm-esper-client"프로젝트를 다음의 명령어로 컴파일한다.

$ cd ~/storm-esper-client/trunk
$ mvn clean dependency:copy-dependencies install -Dmaven.test.skip=true

첨부된 스크립트를 통하여 사용할 EPL을 적용하면 된다.

$ sh ~/storm-esper-client/trunk/etc/run_tester.sh '{"cmd":"EPL command", "params":{"bolt_id":"볼트 명", "statement":{"name":"커맨드 이름", "body":"EPL 쿼리", "state":"STARTED", "do_output": true/false}}}'


4. DataReceiver 

Storm-ESPER가 처리한 데이터는 "out_queue"에 누적된다. DataReceiver는 단순하게 "out_queue"의 데이터를 읽어와서 파일로 저장한다. DataReceiver 프로젝트를 컴파일하여 생성된 jar파일을 실행하여 파일로 저장한다.

$ java -cp ~/maven_data/trunk/target/maven_data-0.0.1-SNAPSHOT.jar com.embian.maven_data.tester.DataReceiver ~/maven_data/conf/receive.conf >> ~/maven_data/logs/receive.log


예제 실행

간단한 예제를 통하여 실행이 잘 되는지 확인해 보자.

시나리오

1. nginx의 access log를 JSON으로 만든 데이터 스트림에서 5분동안 응답시간이 1초가 넘는 Request의 통계를 출력

2. 5분동안 Page A -> Page B -> Page C의 경로로 움직인 IP에 대해서 출력

nginx의  access log를 JSON으로 만든 데이터 스트림 샘플

{"status": "200", "body_bytes_sent": "9784", "remote_user": " ", "request_time": "0.000", "http_referer": "http://www.mmm.com/bbs/board.php?page=A&wr_id=1", "remote_addr": "192.168.1.1", "request": "GET /skin/board/aa.aaa/aa.js/aaa.js?time=1434393200 HTTP/1.1", "http_user_agent": "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko", "upstream_response_time": "-", "time_local": "16/Jun/2015:03:33:20 +0900"}

사용한 command를 초기화 하려면 다음을 실행한다.

$ sh ~/storm-esper-client/trunk/etc/run_tester.sh '{"cmd":"clean", "params":{}}'


0. LogEvent스키마 등록

$ sh ~/storm-esper-client/trunk/etc/run_tester.sh '{"cmd":"add_statement", "params":{"bolt_id":"esper-bolt-1", "statement":{"name":"CreateLogEventType", "body":"create schema LogEvent(status string, body_bytes_sent string, remote_user string, request_time string, http_referer string, remote_addr string, request string, http_user_agent string, upstream_response_time string, time_local string)", "state":"STARTED", "do_output":false}}}'

1. nginx의 access log를 JSON으로 만든 데이터 스트림에서 5분동안 응답시간이 1초가 넘는 Request의 통계를 출력

$ sh ~/storm-esper-client/trunk/etc/run_tester.sh '{"cmd":"add_statement", "params":{"bolt_id":"esper-bolt-1", "statement":{"name":"Senario1-1", "body":"SELECT count(remote_addr) FROM LogEvent.win:time(5 min) WHERE cast(request_time,float) >= 1.000 ", "state":"STARTED", "do_output":true}}}'

2. 5분동안 Page A-> Page B-> Page C의 경로로 움직인 IP에대해서 출력

$ sh ~/storm-esper-client/trunk/etc/run_tester.sh '{"cmd":"add_statement", "params":{"bolt_id":"esper-bolt-1", "statement":{"name":"Senario1-2", "body":"SELECT target3.remote_addr, target3.request from  pattern [  every target=LogEvent(request like \"%page=A%\") -> (target2=LogEvent(request like \"%page=B%\" and target.remote_addr = target2.remote_addr ) -> target3=LogEvent(http_referer like \"%page=C%\" and target.remote_addr = target2.remote_addr and target2.remote_addr=target3.remote_addr))  ].win:time(5 min)", "state":"STARTED", "do_output":true}}}'


결과물은 DataReceiver를 통하여 파일로 저장된 내역에서 확인이 가능하다.

시나리오 1. 결과물

--queueServerAddr  :  192.168.0.28
--queueName        :  out_queue

{"newEvents":[{    "count(remote_addr)": 1
}],"oldEvents":[]}
{"newEvents":[{    "count(remote_addr)": 2
}],"oldEvents":[]}
{"newEvents":[{    "count(remote_addr)": 3
}],"oldEvents":[]}
{"newEvents":[{    "count(remote_addr)": 4
}],"oldEvents":[]}
{"newEvents":[{    "count(remote_addr)": 5
}],"oldEvents":[]}
{"newEvents":[{    "count(remote_addr)": 6
}],"oldEvents":[]}
{"newEvents":[{    "count(remote_addr)": 7
}],"oldEvents":[]}

시나리오 2. 결과물

{"newEvents":[{    "target2.remote_addr": "173.254.216.67",
    "target2.request": "GET page=C HTTP/1.0"
}{    "target2.remote_addr": "173.254.216.67",
    "target2.request": "GET page=C HTTP/1.0"
}],"oldEvents":[]}
{"newEvents":[{    "target2.remote_addr": "203.133.168.168",
    "target2.request": "GET page=C HTTP/1.1"
}{    "target2.remote_addr": "203.133.168.168",
}],"oldEvents":[]}
{"newEvents":[{    "target2.remote_addr": "211.53.23.131",
    "target2.request": "GET page=C HTTP/1.1"
}{    "target2.remote_addr": "211.53.23.131",
    "target2.request": "GET /page=C HTTP/1.1"
}{    "target2.remote_addr": "211.53.23.131",
}],"oldEvents":[]}
{"newEvents":[{    "target2.remote_addr": "66.249.71.111",
    "target2.request": "GET page=C HTTP/1.1"
}{    "target2.remote_addr": "66.249.71.111",
      "target2.request": "GET page=C HTTP/1.1"
}{    "target2.remote_addr": "66.249.71.111",}],"oldEvents":[]}


간편한 실행이 어려웠고, 새로운 시스템을 학습해가며 접했기 때문에, 꽤 애를 먹은 프로젝트 실행을 거쳤다. 스크립트가 있어서 그나마 편하게 실행을 할 수 있었던 것 같다. 위의 설치 및 실행기는 단독 머신에서 실행을 기준으로 설명되어있지만, 여러대의 머신에서도 설정파일만 적용해주면 동일하게 실행할 수 있다. 

위의 실행방법을 하나씩 따라해보면 실제로는 실행하기 어렵지 않을 것으로 보인다. 이상으로 Storm-ESPER의 실행기를 마친다.


Posted by 알 수 없는 사용자
,

On-ly 2.0이 릴리즈 되었다. 프로젝에 참여하면서 경험하고 느낀 점이 많기에  그동안 느꼈던 것들을 회사 블로그에 써 보는 것이 어떻겠냐는 본부장님의 제안이 있었고, On-ly 2.0 프로젝트 진행 과정 정리도 할겸 글을 쓰게 되었다. 

따듯한 봄날 외부업체에 파견을 나갔다 친정 같은 본사로 복귀한 나는 새로운 프로젝트에 참여 하게 되었다. 

그것은 On-ly 2.0 프로젝트! 

사용자 수를 늘리고,사용자들이 건강한 게임라이프를 즐길 수 있도록 의미있는 컨텐츠를 집어 넣고자 On-ly 2.0 프로젝트가 시작되었고, 난 이 프로젝트에 참여 한다는 것에 완전 신나 있었다.



본격적인 기획에 앞서 회사 사람들과 함께 모여 아이디어 회의를 했다. 

새로운 On-ly 2.0에 추가했으면 하는 기능들을  생각해 마음껏 의견을 내주셨는데  그 열기가 무척 뜨거웠다.


 (On-ly 2.0 아이디어 중 일부)

 

각자 의견을 낸 것을 문서로 정리해 보는 시간을 가졌고, 우리가 추구 했던 목표에 부합하는 아이디어를 모두 반영해 본격적인 기획을 시작 하였다.학교 다닐때 팀프로젝트를 할 때 주로 개발만 하고 기획문서는 작성해 보지 않았기 때문에 기획문서를 처음 만들게 된 나는 어디서 부터 시작해야 할 지 막막했다. 

 

다행이도 박본부장님께서  1차적으로 information architecture를 작성해주셔서 좀 더 쉽게 기획안을 작성해 나갈수 있었다.



 (On-ly 2.0 information architecture중 일부)


하지만 On-ly 기획안 작업을 하면서 나의 발목을 붙잡았던 것은 포토샵 작업이었다. Mockup작업을 하면서 포토샵으로 이미지 작업을 해야 했기 때문이다.포토샵 잘 하는 사람들을 보면 우와 하면서 엄지척 했었는데 직접 포토샵으로 작업 할일이 생기니 삽질이 따로 없었다.

  

디자이너한테는 비교적 쉬운 일이겠지만 개발자인 나는 내가 생각하고 있는 것을 포토샵을 이용해 이미지로 나타낸 다는 것은 무척어려운 일이었다. 다크써클이 점점 내려오기 시작했다. 


(작업한 이미지를 부장님께 보여드릴때 )


하지만 초긍정적인 마인드를 발휘하였고  드디어 기획안을 완성하게 되었다.

완성된 기획안은 다음과 같다. 중간중간에 빠진 내용은 아직 공개하기에 민감한 내용들이라 항목에서 제외시켰다.




삽질하며 만들었었는데 최종적으로 바뀌게 된 Mockup중 일부가 다음과 같다



 게임 CD느낌을 살려볼려고 했으나 음악 CD느낌이 난다

 그래서 기본 책장이 들어간 이미지로 변경했다.




사용자별 게임랭킹을 표현하고 싶었지만 총체적 난국이 되어버렸다 

그래서 단순하게 flat한 이미지로 변경했다.


기획안 작업은 시행착오를 많이 겪었던 과정이었고 부족했던 점도 있지만 우리가 추구하는 컨텐츠를 녹여내기 위해 회사 사람들과 함께 치열하게 고민했던 작업이었다.  또한 기획안을 최종 검토 하면서 과감히 기획을 쳐내는 작업이 있었는데  그 때는  정말 아쉬웠다.  정말 열심히 작업했기 때문이다.


기획안이 완성 된 후 개발 단계로 넘어가게 되었고, 이제 본격적인 개발을 시작하게 되었다. 

직접 기획했기해 순조로울 것 만 같은 개발단계는 결코 순조롭지 못했다. 그 이야기는 다음 포스팅(주니어 개발자의 On-ly 2.0 프로젝트 경험기-개발편)에서 써 내려갈 것이다. 기대해도 좋다. 

다사다난했던 주니어 개발자의 On-ly 2.0 프로젝트 경험기-기획편은 이것으로 마무리 한다.


-끝-  

Posted by 알 수 없는 사용자
,

Apache Storm과 Spark는 그 동안 많이 사용되고 있는 실시간 데이터 처리 엔진이다. 그런데 eBay가 Pulsar를 발표하면서 실시간 데이터 처리 엔진에 후보가 하나 더 늘게되었다.





Storm-ESPER는 Apache Storm과 EsperTech의 ESPER를 결합한 것으로 엠비안에서 해당 과제에 대해서 연구한 적이 있다. (Storm & Esper Prototype 및 Test

여기서는 엠비안에서 진행했던 Storm-ESPER 엔진과 eBay Pulsar(정확히는 Pulsar를 구성하는 Jetstream)를 비교해보고자 한다. 


비교를 하기 위해서 다음의 상황을 가정한다.

시나리오 1
기존 시스템은 nginx를 통해서 웹서비스를 운영하고 있다. 기존 시스템에 CEP 엔진을 붙여서 다음의 조건을 만족시키도 싶다.

1. Response Time이 3초 이상인 모든 Request는 DB에 저장하고 해당 내용을 관리자에게 메일을 발송한다.
2. 만약 국내 IP일 경우 페이지 A를 방문한 사람들이 어느 페이지로 이동했는지에 대한 통계를 집계한다.


* Cost :  도입을 위해 어느정도의 커스터마이징이 필요한가?

곤충을 머리, 가슴, 배로 나누는 것 처럼 시스템도 입력, 처리, 출력으로 나눌 수 있다. 이 3가지 부분이 커스터마이징이 필요한 부분이다. 먼저 입력 부분에서 해결해야 할 문제는 nginx의 access log를 수집해야 한다는 것이다. 이 문제는 Storm-ESPER, Pulsar 둘 다 가지고 있다. nginx의 access log는 fluentd를 사용해서 수집하여 Json형태로 변형한 후 Message Queue로 던지게 하면 간단히 해결할 수 있다.

nginx에서 Message Queue까지 던지게 하는 부분은 Storm-ESPER나 eBay Pulsar 모두 필요한 단계이다. (물론 다른 방법으로 데이터를 수집할 수 있도록 할 수 있다. 여기서는 fluentd를 통해서 Message Queue로 던지는 방식으로 구현했다고 가정한다.)

이제, Storm-ESPER와 Jetstream(eBay Pulsar)으로 위의 시나리오를 구현할 경우 어떤 차이가 있는지 알아보도록 하자.
    • Storm-ESPER
      Storm-ESPER의 구성은 다음과 같이 될 수 있다.


[ 그림 1. Storm-ESPER의 구성 ]


Storm-ESPER의 기본 구성에서 추가해줘야 하는 작업은 다음과 같다.

1. EPL Bolt에서 GeoIP를 써서 IP의 국가를 추출할 수 있는 클래스 작성
2. 메일발송, 통계 집계 등을 위한 Sinker 작성

이렇게 2가지만 추가로 구현하면 위의 시나리오를 만족할 수 있다. 물론 EPL Bolt에 다음과 같은 EPL을 처리하도록 추가해줘야 하지만 이것은 Storm-ESPER의 기본 구성에 속하는 운영 툴을 통해서 동적으로 추가하는 것이 가능하다.

    • Jetstream (eBay Pulsar)
      Jetstream의 구성은 다음과 같이 될 수 있다.

[그림 2. Jetstream (eBay Pulsar)의 구성]

각 Stage의 이름은 Pulsar의 예제에서 따왔지만 실제 Pulsar의 코드를 바로 사용하는 것은 아니다. 각 Stage별로 추가해야 하는 작업은 다음과 같다.

1. Collector
 - Message Queue로부터 데이터를 읽어와서 GeoIP를 써서 IP의 국가를 추출하는 클래스를 작성
 - Pipeline Wiring을 수정하여 outbound Channel을 Distributor쪽으로 맞춰준다.
2. Distributor
 - 각 EPL을 가지고 있는 Bean을 작성
 - 각 EPL들의 결과를 구분하여 Metric Calculator쪽으로 outbound Channel을 맞춰준다.
3. Metric Calculator
 - 메일발송, 통계 집계 등을 위한 코드 작성

추가해야 하는 작업은 Storm-ESPER에서 했던 작업들에 추가로 Wiring을 위한 설정을 해줘야 한다. Storm-ESPER가 EPL을 동적으로 추가/삭제할 수 있는 운영 툴을 제공해주는 반면에 Jetstream은 Config에서 해당 기능을 할 수 있도록 해준다.


Storm-ESPER와 eBay Pulsar 모두 도입을 위해서는 Customizing이 필요하다. Business Logic에 따라서 그 비용의 차이가 생길 수 있지만 두 시스템 모두 가장 기본이 될 수 있는 부분에 대해서는 준비가 되어있기 때문에 Business Logic을 제외한 나머지 불필요한 코드 작성을 최소화 할 수 있게 해준다.

결론.
Storm-ESPER는 데이터의 입출력에 대해서 미리 정의해놨기 때문에 Integration이 쉽고 Business Logic에 대해서만 집중할 수 있다. 그리고 Bolt간의 통신 등은 Storm에서 이미 정의되어있는대로 하기 때문에 Stage간 연결을 신경쓸 필요가 없다. 단, Topology 구성에 대해서는 고민을 해야 한다.

eBay Pulsar는 입출력 부분에 대해서도 신경써야 하지만 부담될 정도는 아니다. 그리고 Stage간 wiring도 직접 해줘야 하기 때문에 약간의 수고가 필요하다. Stage간 wiring은 XML파일 수정하는 것 정도이다.

Storm-ESPER : ★★★★☆
eBay Pulsar : ★★★☆☆


* Cost : Business Logic이 변경되는 경우 쉽게 대응할 수 있나?

시나리오 1-1
시나리오 1에서 구축한 시스템에 다음의 조건을 추가한다.
국내 IP일 경우 페이지 A를 방문한 후 B 페이지를 방문하는 사용자가 있을 경우 관리자에게 메일을 발송한다.

Business Logic이 변경되는 경우에 대한 대응은 도입하는 것 만큼이나 중요한 문제이다. 시간과 노력을 들여서 도입한 시스템이 Business Logic의 변경을 쫓아가지 못할 경우 전혀 사용하지 못하는 상황까지 발생할 수 있다. 
사실 개발하는 입장에서는 Business Logic이 변경된다 하더라도 그에 맞게 수정할 수 있다. 하지만 문제는 어느정도의 시간과 노력이 필요하느냐이다.

일반적으로 CEP와 관련되어 변경될 수 있는 Business Logic을 예상해보면 다음과 같다.
1. IFTTT와 같이 특정 조건 발생시 특정 행동을 할 수 있도록 하는 로직의 추가
2. Input의 형태 변화 및 다양화

Input의 형태가 변경되거나 새로운 Input이 추가될 경우 Storm-ESPER의 경우 단순히 Spout을 추가하는 것으로 어느정도 처리가 가능하고 Pulsar도 마찬가지로 Collector를 추가하는 것으로 처리가 가능하다.

시나리오 1-1과 같이 특정 조건이 추가되는 경우에는 Storm-ESPER와 Pulsar 모두 EPL에서 처리할 수 있도록 하는 것이 유리하다. EPL은 대충 다음과 같은 느낌으로 나올 수 있다.

SELECT target2.* from  pattern [ every target=LogEvent(request like "%page=A%" and geo="KR") -> (target2=LogEvent(request like "%page=B%" and target.remote_addr = target2.remote_addr and target2.geo="KR" ))];

이제 EPL을 Storm-ESPER와 eBay Pulsar에 추가하기 위해서는 어떤 작업이 필요한지 알아보도록 하자.
    • Storm-ESPER
      엠비안에서 진행한 Storm-ESPER는 EPL을 동적으로 추가/삭제할 수 있는 툴을 제공한다. 이 툴을 사용해서 Event Type을 지정해주고 EPL Bolt에 EPL을 추가시키면 된다.

      그리고 결과의 형태에 따라서 기존의 메일 발송 Sinker를 그대로 사용할 수도 있고 추가로 작성해줘야 할 수도 있다.

    • Jetstream (eBay Pulsar)
      eBay Pulsar는 Config를 통해서 동적으로 EPL을 추가하는 것이 가능하다. Config의 웹 인터페이스로 로그인해서 Bean을 등록해주면 된다.

      그런데 만약 시스템 구축 초기에 Config를 사용하지 않고 각 Stage의 XML에서만 Bean을 관리할 경우 XML파일을 수정해서 EPL을 등록해야 한다.

      Storm-ESPER와 마찬가지로 메일 발송을 그대로 사용할 수도 있고 추가로 작성해줘야 할 수도 있다.

결론.
Storm-ESPER는 기본적인 Data Flow가 잡혀있는 상태이기 때문에 변경사항이 발생할 경우 Data Flow만 유지될 수 있다면 추가적인 작업을 최소화할 수 있다. 반면에 Jetstream (eBay Pulsar)는 초기에 Config 구성을 어떻게 했느냐에 따라서 변경사항에 대해서 단순히 Config에 Bean만 등록하는 것으로 마무리할 수 있고 각 Stage의 XML파일을 수정해야 할 수도 있다. 물론 초기 설정에 대한 문제이기 때문에 Config를 활용하도록 구성한 경우라면 Storm-ESPER만큼이나 쉽게 작업할 수 있다.

Storm-ESPER : ★★★★☆
eBay Pulsar : ★★★


* Stability : Failover가 가능한가?

서비스 운영에서 Failover는 필수요소가 되어가고 있다. Storm-ESPER와 eBay Pulsar도 Failover에 대해서 점검해볼 필요가 있다.

    • Storm-ESPER
      Storm-ESPER의 경우 기본적으로 Storm 위에 Esper를 올려놓은 것이다. 그렇기 때문에 Failover에 대해선는 Storm과 같다고 할 수 있다.

      Storm을 구성하는 각각의 요소들에 문제가 생긴 경우 어떻게 동작하는지 알아보면 다음과 같다.
      1. Bolt : Bolt가 죽는 경우 Supervisor가 해당 Bolt를 restart하게 된다.
      2. Supervisor : Supervisor가 죽는 경우 Nimbus에 의해서 Reassign 및 Restart하게 된다.
      3. Nimbus : Nimbus가 죽는 경우 Topology의 동작에는 문제가 없다. 단, Nimbus가 죽는 경우 Supervisor에 대한 관리를 못하게 된다. Storm의 구성에서는 Nimbus를 Restart하거나 Reassign할 수 있는 시스템이 없다. 

      Nimbus가 SPOF라고 하는 말들이 있긴 하다. 하지만 SPOF라면 말 그대로 Nimbus가 죽었을 경우 전체 Topology가 동작을 못하고 죽어버리든지 그와 비슷한 상황에 빠져야 하는데 실제로는 그렇지 않다.
      그리고 Nimbus가 죽은 경우 다시 실행만 시켜놓음 되기 때문에 번거롭고 신경쓰이는 상황이기는 하지만 SPOF까지는 아니다.

    • Jetstream (eBay Pulsar)
      Pulsar는 Clustering구성을 통해서 Failover를 할 수 있도록 되어있다. 그런데 Pulsar는 Storm과는 다르게 노드가 Down된 경우 restart해주는 기능 등이 없다. 하지만 Nimbus와 같이 단일 노드로 구성되는 요소는 없다.

      그리고 Storm과는 달리 Pulsar는 3개의 이벤트 전달 모델을 가지고 있다.
      1. Push 모델
          Storm과 같이 다음 노드로 Push하는 모델이다. 
      2. Pull 모델
          Message Queue를 통해서 이벤트를 받는쪽에서 Queue의 내용을 가져가는 모델이다.
          Screenshot
      3. Hybrid 모델
          Push 모델과 Pull모델을 합친 것으로 기본적인 경우 Push를 통해서 데이터 전달을 하다가 문제가 생겨서 데이터 처리를 못하게 되는 경우 Message Queue에 넣고 replay 시키는 모델이다.
      Screenshot

      이와 같은 3개의 모델을 활용하여 Storm보다 더 유연한 Topology구성이 가능하다.
결론.

Storm-ESPER는 Nimbus, Supervisor 등에 의해서 문제가 생긴경우 자동으로 복구를 시도하게 된다. 하지만 Storm에서는 Nimbus의 문제에 대해서는 대안이 없는 상황이다.
eBay Pulsar는 3가지 데이터 전달 모델을 활용해서 Cluster구성을 하는 것이 가능하다.

Storm-ESPER : ★★★
eBay Pulsar : ★★★★

* Extensibility : Scale out이 가능한가?

시스템의 규모를 초기에 정확히 예측하는 것은 불가능하다. 그렇기 때문에 시스템 규모를 확장해야 하는 경우에는 단순히 시스템을 추가하는 것으로 서비스 규모를 확장할 수 있도록 하는 것이 중요하다. Storm-ESPER, eBay Pulsar의 Scalability에 대해서 알아보면 다음과 같다.

    • Storm-ESPER
      Storm-ESPER는 앞에서 언급한대로 Storm의 시스템 구성을 가지고 있다. Storm에서는 Scale out이 가능하다. 하지만 Node를 추가한 후에는 Topology를 Restart해야 한다는 문제점이 있다.
      Topology를 Restart하는 동안은 데이터 처리를 못하는 것은 당연하다. 그렇기 때문에 엠비안에서 진행한 Storm-ESPER에서는 Input과 Output부분에 Message Queue를 위치시켜서 Topology가 Restart되는 동안 발생할 수 있는 문제를 최소화 시켰다.

      Message Queue에 의해서 데이터가 유실되는 것이 아니기 때문에 대부분의 경우 Topology가 Restart되는 것에 대해서 문제가 발생하지 않는다. 단, Topology의 Hot Deploy는 Storm-ESPER에서는 불가능하다는 단점이 있다.

    • Jetstream (eBay Pulsar)
      eBay Pulsar는 Pipeline의 설정이 모두 XML에서 정의한 Bean에 들어가있고 Bean은 Config에서 관리하도록 할 수 있기 때문에 Config만 활용한다면 Node가 추가되거나 Topology가 변경되는 상황이라 하더라도 Topology의 중단 없이 서비스가 가능하다.

결론.
Storm-ESPER와 eBay Pulsar 모두 Scale out은 가능하다. 하지만 Storm-ESPER의 경우 Topology를 Restart해야 하는 문제가 있다. Storm-ESPER는 Input, Output의 처리에 Message Queue를 사용하기 때문에 Business 환경에서는 Critical한 문제를 일으키지는 않지만 Topology가 Restart되는 동안에는 데이터 처리를 할 수 없게 된다.

Storm-ESPER : ★★★
eBay Pulsar : ★★★★


비교 결과.

앞에서는 Storm-ESPER와 eBay Pulsar에 대해서 비용, 안정성, 확장성이란 주제로 비교를 해보았다. 비교 항목마다 점수를 준 것을 종합해보면 다음과 같다.

비교항목 

Storm-ESPER 

eBay Pulsar 

비용 

8/10 

6/10 

안정성

3/5 

4/5 

확장성

3/5 

5/5 

합계

14/20 

15/20 

Storm-ESPER는 비용적인 측면에서 좋은 점수를 받았고 eBay Pulsar는 확장성 부분에서 좋은 점수를 받았다. 안정성은 eBay Pulsar가 조금 더 좋게 나왔다.

Storm-ESPER는 기본적인 Data Flow가 정의되어있기 때문에 Business Logic을 EPL을 통해서 적용만 하면 대부분의 환경에서 활용 가능하다는 장점이 있다. 이런 장점 때문에 비용적인 측면에서 좋은 점수를 받은 것으로 생각된다. 하지만 Storm이 가지는 Nimbus에 대한 문제점 등은 어쩔 수 없이 단점으로 가지고 있다.


eBay Pulsar는 Pipeline을 다양하게 구성할 수 있고 Config를 이용한 Hot Deploy가 가능하다는 것이 가장 큰 장점이라 할 수 있다. 하지만 eBay Pulsar는 예제 수준 정도이고 실제 사용하려면 Jetstream을 사용하여 Pipeline을 구성해야 한다. 통신 모델을 정의하고 데이터 형태를 정의하는 등의 작업을 XML 또는 Config에 대햐 한다는 단점이 있다.

그리고 눈에띄게 보이는 차이점은 Storm-ESPER는 EPL의 결과를 Output Queue에 던져서 다음 처리를 할 수 있도록 한 반면에 eBay Pulsar는 EPL의 결과를 outbound channel로 던지기 전에 다른 Processor로 전달해서 부가적인 처리 등을 할 수 있다는 것이다.


쉽고 빠르게 CEP 엔진을 구축하기 위해서는 Storm-ESPER를, 좀 더 유연한 CEP설계를 하고 싶을 때에는 eBay Pulsar를 쓰는 것이 유리하다.



Posted by 알 수 없는 사용자
,

이전 포스트에서 eBay Pulsar에 대해서 간단히 알아봤다.


여기서는 Pulsar의 tutorial 및 demo를 통해서 Pulsar에 대해서 좀 더 자세히 알아보도록 한다.



Pulsar의 White Paper를 보면 다음과 같이 간단한 Architecture가 설명되어있다.


<Fig. 1. Real-time Data Pipeline>

Real Time Data Pipeline(이하 Pipeline)은 Collector, Sessionizer, Event Distributor, Metrics Calculator로 구성되어있는 것을 알 수 있다. 각 구성요소에 대해서는 이전 포스트(Pulsar - 오픈소스 실시간 분석 플랫폼 : White Paper)에 간단히 설명되어있다.

Pulsar의 Get Started 페이지에 Demo에 대해서 설명이 되어있다. 설명은 부실할 정보로 매우 간단하게 되어있고 Demo를 실행했을 때의 화면도 보여주고 있다. 

이 내용만으로는 직접 데모를 돌려보지 않고 동작을 이해하기는 어려울 것 같다. (데모 페이지의 Pre-Request에는 깨진 링크도 있다!)


데모를 실행하기 위한 Dependency

데모를 실행해보기 위해서는 먼저 Zookeeper, Mongo, Kafka, Cassandra를 설치해야 한다. 

Pulsar를 운영하기 위해서 위의 4가지 Dependency가 만족해야 하는 것은 아니다. 이건 어디까지나 Pulsar의 Demo를 실행해보기 위해서 필요한 것이고 모든 구성요소가 Dependency를 필요로 하는 것은 아니다.


아무튼.. Zookeeper, Mongo, Kafka, Cassandra를 설치해야 한다. 다행히 4가지 모두 Pulsar 또는 다른 사람들이 dockerize 해놨기 때문에 귀찮은 설치과정 없이 docker를 통해서 설치 및 실행이 가능하다.

각각에 대해서 알아보면 다음과 같다.

1. Zookeeper

zookeeper는 다음과 같이 실행시키도록 되어있다.

docker run -d --name zkserver -t "jetstream/zookeeper"

jetstream/zookeeper docker image는 기존에 있던 zookeeper image에서 base image를 변경한 것이다. 그리고 expose하는 port는 2181만 정의하고 있다.

2. Mongo

MongoDB는 docker hub에 등록되어있는 일반적인 이미지를 실행시키도록 되어있다.

docker run -d --name mongoserver -t "mongo"

3. Kafka

Kafka는 다음과 같이 jetstream에서 새로 만든 docker image를 사용하도록 되어있다.

docker run -d --name kafkaserver -t "jetstream/kafka"

jetstream/kafka는 zookeeper를 포함하는 kafka single node를 구성한 것이다. jetstream/kafka는 zookeeper에 등록되어있는 broker entry의 advertised ip로 host ip를 사용하도록 되어있다.

4. Cassandra

Cassandra는 docker hub에 등록되어있는 일반적인 이미지를 실행시키도록 되어있다.

docker run -d --name cassandraserver -t "poklet/cassandra"

Cassandra는 metriccalculator에서 집계한 결과를 저장하는 용도로 사용된다. 데이터를 저장하기 위한 테이블은 다음과 같이 생성한다.

mkdir /tmp/pulsarcql
wget https://raw.githubusercontent.com/pulsarIO/realtime-analytics/master/metriccalculator/pulsar.cql -O /tmp/pulsarcql/pulsar.cql
docker run -it --rm --link cassandraserver:cass1 -v /tmp/pulsarcql:/data poklet/cassandra bash -c 'cqlsh $CASS1_PORT_9160_TCP_ADDR -f /data/pulsar.cql'


위에서 설명한 Dependency들은 pipeline의 구성요소들이 사용하게 된다. 하지만 각각의 pipeline 구성요소가 위의 모든 dependency를 필요로 하는 것은 아니다.

각 구성요소별로 어떤 dependency를 필요로 하는가에 대한 것은 Pulsar에서 제공해준 demo 실행 스크립트(https://github.com/pulsarIO/realtime-analytics/blob/master/Demo/rundemo.sh)를 보면 알 수 있다.


Pipeline의 구성요소

demo 실행 스크립트를 확인해보면 다음과 같은 순서대로 pipeline 구성요소를 실행시킨다.

1. config

docker run -d -p 0.0.0.0:8000:9999 -p 0.0.0.0:8081:8080 --link zkserver:zkserver --link mongoserver:mongoserver -t "jetstream/config"

--link로 설정된 부분을 보면 config는 Zookeeper, MongoDB를 사용하는 것을 알 수 있다.

그런데 config(ConfigApp)는 위에서 보여준 Architecture에 포함되어있지 않다. config의 역할은 전체 pipeline의 provision configuration을 관리하는 것이다.

config에서 연결하는 시스템을 봤을 때 pipeline의 configuration을 저장하는 용도로 사용되는 것을 알 수 있다.

config는 Jetstream에 포함되어있는 구성요소이다.


2. replay

Replay에 대해서는 Pulsar의 Get Started 페이지에서 다음과 같이 설명하고 있다.

Replay는 Queue Full, 네트워크 부하 등으로 다른 stage에서 처리 실패한 이벤트를 replay시키는 역할을 한다. 

너무 의역한 것이기는 하지만 아무튼 이런 역할을 한다. -_-

replay는 이벤트에 tag를 달아서 해당 이벤트가 replay에 의해서 보내진 것인지를 알 수 있도록 한다.

demo 실행 스크립트에서는 replay를 다음과 같이 실행시킨다.

docker run -d -p 0.0.0.0:8001:9999 --link zkserver:zkserver --link mongoserver:mongoserver --link kafkaserver:kafkaserver -t "pulsar/replay"

replay는 kafka, mongodb, zookeeper에 대한 의존성을 가지고 있다. 


3. Sessionizer

Sessionizer는 이벤트의 session state를 관리하고 session marker event를 생성하는 역할을 한다. Pulsar 홈페이지에서는 Sessionizer는 si를 affinity key로 사용하여 동일한 si event는 동일한 노드로 라우팅된다고 설명하고 있다. 그런데 si가 어떤 것을 의미하는지에 대해서는 설명이 되어있지 않다. 그냥 Session Identifier 정도로 예상하고 있다. 

session state라는 것은 session의 메타데이터(자주 변하지 않는 ip, user agent정보 등)와 variables를 포함한다. sessionizer의 로직은 EPL에 의해저 정의되어있다.

demo 실행 스크립트에서는 다음과 같이 실행시키고 있다.

docker run -d -p 0.0.0.0:8003:9999 --link zkserver:zkserver --link mongoserver:mongoserver --link kafkaserver:kafkaserver -t "pulsar/sessionizer"

replay와 마찬가지로 cassandra를 제외한 나머지 3개 시스템(kafka, mongodb, zookeeper)에 대한 의존성을 가지고 있다. 


4. Distributor

Distributor는 이벤트를 각 목적지에 맞게 전달해주거나 걸러내거나 변형시키는 역할을 한다. 사용자는 EPL을 통해서 설정하는 것이 가능하다.

demo 실행 스크립트에서의 실행은 다음과 같다.

docker run -d -p 0.0.0.0:8004:9999 --link zkserver:zkserver --link mongoserver:mongoserver --link kafkaserver:kafkaserver -t "pulsar/distributor"


5. Metrics Calculator

이름 그대로 metric을 계산해서 저장하는 역할을 한다.

demo 실행 스크립트에서의 실행은 다음과 같다.

docker run -d -p 0.0.0.0:8005:9999 --name metriccalculator --link zkserver:zkserver --link mongoserver:mongoserver --link kafkaserver:kafkaserver  --link cassandraserver:cassandraserver -t "pulsar/metriccalculator"

다른 구성요소와는 달리 cassandra와 연결을 가지고 있는 것을 볼 수 있다.

Metrics Calculator는 2개의 stage로 구성되어있다. 첫번째 stage는 짧은 시간동안의 집계를 수행하고 그 후에 두번째 stage를 통해서 긴 시간동안의 집계를 수행하게 된다.


6. Collector

pipeline의 구성요소 중 가장 앞에 들어가는 요소인데 demo 실행 스크립트에서는 제일 마지막에 실행시킨다.

실행은 다음과 같이 되어있다.

docker run -d -p 0.0.0.0:8002:9999 -p 0.0.0.0:8080:8080 --link zkserver:zkserver --link mongoserver:mongoserver --link kafkaserver:kafkaserver -t "pulsar/collector"
이름 그대로 event를 수집하는 역할을 한다. 


Demo의 실행
Pulsar 홈페이지에서는 다음의 3가지 Demo Applications를 제공해주고 있다.
1. MetricService : MetricUI를 위한 metric을 제공해주는 역할을 한다.
2. MetricUI : Metric Dashboard
3. TwitterSample : 트위터에서 발생하는 이벤트를 pulsar로 넣어주는 샘플

Pulsar의 demo 실행 스크립트에서는 MetricService, MetricUI순으로 실행한 후 제일 마지막에 TwitterSample을 실행시키도록 되어있다.

특징으로 보면.. TwitterSample은 데이터를 입력하는 역할을 하고 MetricService, MetricUI는 pipeline을 지나온 결과를 출력하는 역할을 한다.

그런데 TwitterSample의 코드에서 wiring관련 xml을 보면 다음과 같은 내용이 있다.

<bean id="OutboundMessageChannelAddress"

        class="com.ebay.jetstream.event.channel.messaging.MessagingChannelAddress">

        <property name="channelTopics">

            <list>

                <value>Pulsar.MC/ssnzEvent</value>

            </list>

        </property>

    </bean>


TwitterSample을 데이터를 만들어낸 후 Pulsar.MC/ssnzEvent로 보내는 것을 확인할 수 있다. 

Pulsar의 Architecture 그림을 보면 처음 들어온 이벤트는 Collector에 의해서 수집된 후 Sessionizer로 전달되어야 하는데 Collector의 inbound 설정을 보면 다음과 같이 되어있다.

<bean id="InboundChannelAddress"

        class="com.ebay.jetstream.event.channel.messaging.MessagingChannelAddress">

        <property name="channelTopics">

            <list>

                <value>Pulsar.collector/rawEvent</value>

            </list>

        </property>

    </bean>

위의 내용을 종합해보면 TwitterSample은 Collector로 이벤트를 전달하지 않도록 되어있다. Pulsar.MC/ssnzEvent를 통해서 전달받는 구성요소는 MetricCalculator이다.


Pulsar의 TwitterSample은 자신들이 그려놓은 Architecture와는 맞지 않게 Collector가 아닌 MetricCalculator로 이벤트를 전달하는 것을 알 수 있다.

왜 이런 사태가 발생했는지 간단히 알아보도록 하자.


Pulsar의 정체

Pulsar의 wiki에 보면 Pulsar에 대해서 설명하고 있다. 하지만 천천히 잘 읽어봐도 도대체 Pulsar가 뭔지에 대한 실체를 알기 힘들다. wiki의 Overview에서 설명하는 Pulsar의 특징은 다음과 같다.

1. Pulsar는 Open source realtime analytics platform이다.

2. 사용자가 발생시키는 event(user behavior event)를 실시간으로 수집하고 처리한다.

3. realtime sessionization, multi-dimensional metrics aggregation을 제공한다.

4. SQL-like한 언어를 써서 데이터를 가공하거나 걸러낼 수 있다.

5. 고가용성의 특징을 가지면서 초당 수백만의 이벤트까지 처리할 수 있도록 확장 가능하다.

6. Cassandra나 Druid와 같은 metrics stores와 쉽게 integration이 된다.


위의 특징을 봤을 때 가장 먼저 떠오르는 질문은 다음과 같다.

"user behavior event가 아닌 다른 event를 처리하는 것이 가능한가?"

Collector의 소스를 보면 답을 얻을 수 있다.

Collector에서 연결 관계를 설명하고 있는 appwiring.xml파일을 보면 다음과 같은 내용이 있다.

....생략....

    <bean id="InboundChannelAddress"

        class="com.ebay.jetstream.event.channel.messaging.MessagingChannelAddress">

        <property name="channelTopics">

            <list>

                <value>Pulsar.collector/rawEvent</value>

            </list>

        </property>

    </bean>

....생략.... 

    <bean id="InboundMessages"

        class="com.ebay.jetstream.event.channel.messaging.InboundMessagingChannel">

        <property name="address" ref="InboundChannelAddress" />

        <property name="waitTimeBeforeShutdown" value="5000"/>


        <property name="eventSinks">

            <list>

                <ref bean="EsperProcessor" />

            </list>

        </property>

    </bean>

    

    <bean id="EsperProcessor" class="com.ebay.jetstream.event.processor.esper.EsperProcessor">

        <property name="esperEventListener" ref="EsperEventListener" />

        <property name="configuration" ref="EsperConfiguration" />

        <property name="epl" ref="EPL" />

        <property name="eventSinks">

            <list>

                <ref bean="OutboundMessages" />

            </list>

        </property>

        <property name="adviceListener" ref="CollectorRawEventAdviceProcessor"/>

    </bean>

Pulsar.collector/rawEvent로부터 받은 이벤트를 EPL을 통해서 처리한 후 outBound로 보내는 것을 알 수 있다.

EPL에 대해서는 EPL.xml에 다음과 같이 정의되어있다.

<bean id="EPL" class="com.ebay.jetstream.event.processor.esper.EPL">

         <property name="statementBlock">

            <value>

                <![CDATA[

                

                    update istream PulsarRawEvent set ct = System.currentTimeMillis() 

                    where ct is null;

                    

                    insert into PulsarEvent

                    select 

                        DeviceEnrichmentUtil.getDeviceInfo(ua) as device, 

                        GeoEnrichmentUtil.getGeoInfo(ipv4) as geo, 

                        raw as originEvent 

                    from PulsarRawEvent as raw;


                    @ClusterAffinityTag(colname="si")

                    @OutputTo("OutboundMessages")

                    select device.userAgentVersion as _dd_bv,

                        device.userAgentFamily as _dd_bf,

                        device.userAgentType as _dd_d,

                        device.deviceCategory as _dd_dc,

                        device.osFamily as _dd_os,

                        device.osVersion as _dd_osv,

                        geo.city as _cty,

                        geo.continent as _con,

                        geo.country as _cn,

                        geo.region as _rgn,

                        geo.longitude as _lon,

                        geo.latitude as _lat,

                        geo.countryIsoCode as _tlcn,

                        originEvent.* from PulsarEvent;

                        

                ]]>

            </value>

        </property>

    </bean>

위의 EPL에서 기술하고 있는 ct라든지 ua, ipv4는 어디에서 온 것인지 궁금할 수 있다. Collector의 Simulator의 소스를 보면 Event.txt에서 이벤트의 형태를 가지고 있다는 것을 알 수 있다.

Event.txt는 다음과 같다.

{

    "si": "${siValue}",

    "ac": "727354723",

"tn": "TenantName",

"or": "OrignalName",

"ct": ${ctValue},

    "ipv4": "${ipValue}",

    "ua": "${uaValue}",

    "et": "Mobile",

    "rf": "http://referrer.somewhere.com",

    "url": "http://LandingPage.com",

    "itmT":"${itmTitle}",

    "itmP":${itmPrice},

    "cap":"${campaignName}",

    "capG":${cmapaignGMV},

    "capQ":${cmapaignQuantity}

}

Pulsar의 Collector에서 처리하고 있는 이벤트의 모습을 보면 Pulsar의 Overview를 읽고 생긴 질문에 답을 할 수 있게 된다.

"user behavior event가 아닌 다른 event를 처리하는 것이 가능한가?"

=> 넹~ 하지만 쉽지는 않아요..

다른 이벤트에 대해서 Collector의 xml을 수정해서 처리해야 하는 이벤트에 맞게 바꿔줘야 하고 EPL도 그것에 맞도록 수정해야 한다.

아무튼.. xml을 보고 수정할 수 있고 EPL을 쓸 수 있다면 그럭저럭 Pulsar를 사용해서 이벤트 처리를 할 수 있다.

Pulsar의 Wiki에서는 Pulsar의 각 Stage(Pipeline의 구성요소)는 모두 Distributed CEP Framework를 사용해서 만들었다고 소개하고 있다. Distributed CEP Framework의 이름은 Jetstream이다.

Collector, Sessionizer, Distributor의 코드를 보면 매우 단순하게 되어있다. 모두 Jetstream을 기반으로 했기 때문에 Stage간의 데이터 전달, Esper Integration 등을 신경쓸 필요가 없기 때문이다.

심지어는 TwitterSample도 Jetstream기반으로 만들어져있다!

아무튼.. Pulsar는 Jetstream을 기반으로 한 사용자 행동에 관련한 이벤트를 처리하는 Platform이라고 생각하면 된다.

그렇기 때문에 TwitterSample은 Jetstream 기반의 Component간의 데이터 처리에 대해서 보여준 것이지 Pulsar에 대한 Demo는 아니다.


Pulsar는 Collector, Sessionizer등으로 구성된 Pipeline을 활용하여 실시간 처리를 빠르게 할 수 있다는 장점 말고도 Pulsar를 구현한 Jetstream을 이용하여 상황에 맞는 Pipeline을 쉽게 구축할 수 있다는 장점을 가지고 있다.





Posted by 알 수 없는 사용자
,



이전에 Pulsar 설치와 실행에 대하여 포스팅을 하였는데, 이번에는 Pulsar에서 제공하고 있는 Pulsar White Paper를 간략하게 정리해보도록 하겠다. 원문은 아래 링크에서 확인 가능하다. 

Pulsar White Paper 원문 보러 가기


White Paper

1. Introduction

User behavior event는 user-agent 또는 IP주소와 같은 많은 정보들을 가지고 있다. eBay에서는 다량의 event들을 처리하고 있는데, BOT이 생성한 event들을 걸러내어 처리할 수 있다.

이 문서에서는 Pulsar의 data pipeline에 대한 디자인을 제안한다. 계산 대부분을 CEP 엔진을 사용하여 고가용성의 분산처리 시스템을 구축하였다. 우리는 이벤트 스트림을 데이터 베이스 테이블처럼 사용하는 것을 제안한다. Pulsar는 SQL 쿼리가 데이터 베이스 테이블을 사용하는 것처럼 실시간 스트림에대해 집합을 생성하는 것을 가능하게 한다. 이 문서에서는 Pulsar에서 이벤트 스트림을 처리할 때 이벤트를 보완하게 하고, 필터하고, 변화시키는 방식에 대해서 설명하였다.

2. DATA AND PROCESSING MODEL 

2.1 User Behavior Data 

사용자 행동 데이터의 예측이 불가능한 패턴이 초당 100만 개가 넘게 생산된다. 이러한 데이터를 빠르게 처리하기 위해 in-memory 처리 방식을 해야 한다.

2.2 Data Enrichment    

BOT 데이터들은 필터로 거른다. 필터링을 거친 데이터를 지역, 기기, 인구 통계 등의 데이터로 좀 더 풍부하게 만든다.

2.3 Sessionization

관련된 이벤트를 공통된 키로 구분하여 그룹핑해주는 상태 관리 프로세스이다.

2.4 User defined partial views of original streams

event들의 dimension이 아주 많지만 실제 사용자들은 원하는 특정 demention만 원하기 때문에  사용자들이 설정할 수 있게 하였다.

2.5 Computing aggregates in real-time for groups of multiple dimensions

다양한 dimension을 그룹화 하기 위해서 실시간으로 summary data를 산출 한다.

2.6 Computing Top N, Percentiles. and Distinct Count Metrics in real time

distinct count와 percentile을 구하기 위하여 HyperLogLog와 TDigest라는 알고리즘을 사용하여 공간과 시간을 절약한다. 이 알고리즘들은 근사 알고리즘으로써, 1%대의 에러를 가지는데, 이는 통계학적으로 문제없음이라고 판단한다.  

2.7 Dealing with out of order and delayed events

이벤트가 비정상이거나 지연되는경우, 롤업기능으로 처리 가능하다.

3. ARCHITECTURE

pipeline

<Fig. 1. Real-time Data Pipeline>

3.1 Complex Event Processing Framework

Jetstream 은 Spring으로 작성한 CEP 엔진으로써, 모든 pulsar의 real-time pipeline은 Jetstream으로 작성하였다. Jetstream은 다음과 같은 기능이 탑재되어있다.

1. 처리 로직을 서술적 SQL로 정의할 수 있다.
2. 어플리케이션 재시작이 필요없는 Hot deploy SQL.
3. Annotation 플러그인 프레임워크를 사용하여 SQL 기능성을 증대시킨다.
4. SQL을 사용하여 pipeline을 타고 전달한다.
5. SQL을 사용하여 stream affinity를 동적으로  생성할 수 있다.
6. Spring IOC를 사용한 Declarative pipeline stitching은 런타임에 동적 토폴로지 변경을 가능하게 한다.
7. Esper의 통합기능을 통한 CEP 기능.
8. elastic scaling이 되는 Clustering.
9. Cloud deployment가 가능한다.
10. push pull 모델을 사용한 pub-sub messaging기능을 가지고 있다.

3.2 Messaging 

3.2.1 Ingest Messaging 

REST interface를 사용하여 이벤트를 받아서 처리한다.

3.2.2 Push vs. Pull Messaging

push messaging과 Pull messaging의 장단점이 있기 때문에 어떤것을 선택해야 할 지에 대해 고민하였다.

3.2.3 Messaging Options

Messaging은 하이브리드로 구현하기로 하였다. Jetstream은 kafka를 사용하여 pub-sub cluster messaging을 할 수 있게 하였다.

4. REAL-TIME PIPELINE

4.1 Collector

Real-time pipeline의 첫 번째 단계. Jetstream CEP엔진이 있는 곳이다. 이벤트를 REST interface로 받아서 처리한다. CEP엔진은 BOT 이벤트들을 필터링해준다.

4.1.1 Geo and Device Classification Enrichment

BOT 이벤트들이 걸러내진 이벤트들에 지역 정보를 추가한다.

4.2 Bot Detector

BOT signature cache에 등록된 패턴을 걸러내도 그 외의 패턴들은 걸러내기 쉽지 않다. 하지만 CEP엔진으로 BOT의 특징을 잡아내어 BOT signature cache에 등록하여 Collector가 BOT을 걸러낼 수 있게 한다. 

4.3 Sessionizer

Real-time pipeline의 두 번째 단계이다. 이 단계의 주된 기능은 tenancy based sessionization 을 지원하는 것이다. Sessionization 은 session 기간에 특정 식별자를 포함하는 이벤트의 임시 그룹핑 과정이다. 유니크한 식별자의 이벤트가 처음 탐지되면 각 window는 시작된다. 이 window는 이벤트가 더 들어오지 않으면 끝나게 된다.

4.3.1 Session Meta Data, Counters and State

이벤트가 도달하면, 세션당 메타데이터, 빈도수 계산 및 상태를 관리한다. 모든 처리 로직은 SQL로 작성되었다.

4.3.2 Session Store

Backing store에 back up 되는 local off-heap cache에 세션 레코드를 저장하였다. Sessionizer 에서는 cache entry에 TTL을 세팅 가능하고 해당 entry가 만기 되었을 때 정확한 알림을 받을 수 있어야 하는 것이 필요하였다. 그래서 특별한 off-heap cache를 개발하였다. 

4.3.3 Session Backing Store

Session Backing Store를 위해, 다음의 사항들을 고려하였다.

a. local read, write, delete 지원 
b. local cross data center replication 지원
c. eventual consistency 지원 (고가용성을 달성하기 위해 분산 컴퓨팅에 사용되는 일관성 모델이다. 데이터에 새로운 업데이트가 이루어지지 않은 경우, 마지막으로 업데이트된 값을 반환하는 것을 비공식적으로 보장한다.
d. 저장 항목에 대한 life cycle을 관리한다. (TTL 지원)
e. 쓰기와 읽기의 비율을 10:4로 지원한다.
f. 초당 읽기 쓰기를 1M까지 지원한다.(Scale to)
g. 변수 크기는 200bytes에서 50Kbytes까지 지원한다. (Scale well)
h. Cloud에서 배포를 선호한다.
i. 주어진 클라이언트 노드에서 삽입된 키의 범위를 조회하기 위하여 보조 인덱스를 만든다.

위의 사항을 충족시키는 적합한 Session store를 찾기 위하여 Cassandra, Couchbase, 자체 개발database를 비교했다. Cassandra와 Couchbase는 Disk기반 솔루션이었기 때문에, in-memory방식이 필요한 우리는 자체 개발 database를 Session store로 선택하였다.

4.3.4 SQL extensions

Jetstream은 Esper의 SQL 언어를 확장하기 위하여 사용자들이 원하는 annotation을 작성할 수  있게 annotation 플러그인 프레임워크를 제공한다.

4.4 Event Distributor

pipeline의 세 번째 단계이다. 이 단계의 주 기능은 pipeline subscriber의 커스텀 뷰를 생성하게 하는 것이다.

4.4.1 Event filtering, Mutation and Routing

이벤트들은 SQL 문법으로 변화시키고 필터링하고 전달할 수 있다. 또한, annotaion을 사용하여 이벤트가 지나갈 루트를 지정해줄 수 있다.

4.5 Metrics calculator for Multi-dimensional OLAP

Metrics Calculator는 다양한 dimension과 time series data를 생산하는 사용자 정의의 metrics를 계산하는 실시간 metric computation engine이다. Metrics Calculator는, multiple dimension을 그룹핑하여 추출할 수 있는 SQL쿼리를 실행 할 수 있게 인터페이스를 제공해준다. 이 단계에서는 이벤트를 SQL로 컨트롤 가능하다.

4.5.1 Harvesting Metrics

이벤트들은 random scheduling이나 affinity based scheduling을 통해 Metrics Calulator application cluster에 스케쥴 될 수 있다. Metrics는 short tumbling wondows(10초동안) live stream에서 추출 된다. Window가 진행되고 있을때 unique dimension grouping을 위해 metric event가 생산된다.

4.5.2 Aggregating across the Metrics Calculator cluster

SQL문과 annotation을 사용하여 여러노드간의 aggregation이 가능하다.

4.5.3 Creating rollups in time series database

time series data를 생성하여 DB에 저장하거나 실시간 dashboard에서 widget으로 보여준다.

4.5.4 Metric Store

Metric Store를 하기 위하여 아래의 DB들을 비교해 보았다.

Open TSDB vs. Cassandra vs. DRUID 

 

Open TSDB 

Cassandra 

장점

빠른 데이터 수집
몇몇 자체 집합 함수 사용 가능

른 데이터 수집
Rollup 가능

단점

Rollup생성 불가
기존에 있는 집합으로
새로운 집합 생성을 지원하지 않음

group by 와 집합함수를 지원하지 않음 

Pulsar는 필요조건을 충족시키기 위하여 DRUID를 사용하였다.

5. CONCLUDING REMARKS

이 문서에서는 Pulsar를 구현할 때 고려했던 부분들의 일부이다. 실시간으로 사용자 행동분석과 관련된 문제들을 위하여 데이터와 프로세싱모델에 관해 설명하고 있다. Pulsar는 eBay cloud에서 1년간 사용되었다. 0.01% 미만의 안정적인 유실로 초당 10만 개의 events들을 처리했다. 95퍼센타일로 pipeline의 end to end 지연은 100ms 미만이다. 99.99%의 가용성으로 파이프라인을 성공적으로 구동시켰다. eBay의 몇몇 팀은 성공적으로 우리의 플랫폼을 사용하여 in-session 개인화, 광고, 인터넷 마케팅, 빌링, 비지니스 모니터링 등 많은 문제에 대한 해결책을 찾았다.

Pulsar의 주요 사용처는 사용자 행동 분석에 포커스를 맞추고 있지만, Pulsar를 실시간 처리가 요구되는 많은 다른 사용 경우에 대해서 쓰이기를 원한다.


White Paper에서는 실제로 eBay에서 Pulsar를 사용하여 사용자 행동분석 패턴을 분석하여 여러 가지 문제들을 해결하였다고 서술하고 있다. 또, Pulsar는 빠르고 신뢰도 높은 데이터 처리를 할 뿐만 아니라 실시간으로 데이터 분석이 가능함을 강조하였다. 그 기반은 Jetstram이라는 독자적인 플랫폼이고, 익숙한 SQL문과 annotation을 사용하여 데이터 분석이 가능함을 설명하고 있다.

White Paper가 아주 상세한 부분까지는 서술하고 있지 않지만, 어떤 데이터들을 어떻게, 무엇을 사용하여 처리하는가에 대한 궁금증을 풀 수 있기에는 충분한 것 같다. 자세한 쿼리 예제나 구조가 궁금하면 Pulsar 공식홈페이지에서 확인할 수 있다.

http://gopulsar.io/


마치며...

번역과 이해를 같이 해야하여 어려웠지만, 실시간 데이터 분석 툴의 구조를 나름은 자세히 알 수 있게 되어 의미있는 시간이었음을 상기하며, 이번 포스팅은 여기에서 마친다.



참고자료: http://gopulsar.io/docs/Whitepaper_Pulsar_Real-timeAnalyticsatScale.pdf


Posted by 알 수 없는 사용자
,



eBay에서 Pulsar라는 실시간 데이터 분석 툴을 오픈소스로 공개하였다. 

공식 문서에 따르면, Pulsar는 Scalability, Availability, Flexibility를 강조한 실시간 데이터 분석 및 모니터링 툴이다. 

Pulsar의 key point와 정리는 다음의 포스트를 참고하기 바란다.


eBay Pulsar: real-time analytics platform


위의 포스팅에서 간략하게 정리가 되어있기 때문에, 이번 포스팅에서는 Pulsar의 구성에 관해 설명하고 설치 방법에 대하여 번역하였다. 해당 원문은 다음 링크에서 확인 가능하다.


https://github.com/pulsarIO/realtime-analytics/wiki/Get-Started


Pulsar는...


스트리밍 SQL을 사용한 인터넷 스케일 실시간 분석 툴이다.


Pipeline Components


Pulsar pipeline은 Jetstream framework의 상단에 내장되어 있다. 이 pipeline은 아래와 같은 구성으로 되어있다.

1. Collector : 이벤트를 지역 정보 분류와 기기 타입을 탐지하여 REST endpoint를 통해 수집한다. 2. Sessionizer : 이벤트를 세션화 한 후, 그 세션 상태를 관리하고 마커 이벤트를 만들어 낸다. 3. Distributor : 이벤트 라우터처럼 다른 consumer들에 이벤트를 필터하고 변화시킨다. 4. Metrics Calculator : 다양한 방면에 대한 측정 기준을 계산하고 metrics store에 지속시킨다. 5. Replay : 이벤트들을 downstream 애플리케이션으로 진행하게 하지 못했을 때, Pipeline 애플리케이션들은 문제가 발생한 이벤트를 kafka에 지속시킨다. Replay는 이벤트들을 kafka에서 가져오고, pipeline에서 100%의 신뢰도를 주기 위해 원래의 downstream 애플리케이션으로 진행하게 하는 역할을 한다. 6. ConfigApp - 모든 pipeline을 위한 Dynamic provision configuration들은 Jetstream framework에 built-in app에서 설정 할 수 있다.


Dependencies


pipeline을 실행하려면 다음의 사항들이 요구된다.

1. Zookeeper 2. Mongo 3. Kafka 4. Cassandra

* Docker에 올려져 있는 이미지를 사용 하면 설치하기 쉽다.


Single node Deployment


한 개의 docker 호스트 안에서, 각 docker container instance들은 virtual network를 사용하여 통신한다.

Docker를 지원하는 node를 준비한다.  (* Docker 이미지로 설치를 쉽게 할 수 있다. 이번 포스팅에서는 Docker로 설치하는 법만 포스팅하겠다.)

1. Docker를 지원하는 리눅스 instance를 준비한다. 이때 Docker 버전은 1.3.0 이상이어야 한다. 2. instance의 최소 사양은 8GB RAM | 2 VCPU | 30.0GB Disk


설치하기


스크립트를 실행하여 docker에서 dependencies 항목에 있는 이미지와 pulsar, 그리고 데모까지 한번에 가져올 수 있다. (데모는 바로 실행 가능)

다운로드 링크 또는 


run sh <(curl -shttps://raw.githubusercontent.com/pulsarIO/realtime-analytics/master/Demo/rundemo.sh)


또는 아래 스크립트를 실행하면 된다.

#!/bin/sh

echo '>>> Start external dependency'
sudo docker run -d --name zkserver -t "jetstream/zookeeper"
sleep 5

sudo docker run -d --name mongoserver -t "mongo"
sleep 5

sudo docker run -d --name kafkaserver -t "jetstream/kafka"
sleep 5

sudo docker run -d --name cassandraserver -t "poklet/cassandra"

echo '>>> Sleep 30 seconds'
sleep 30

mkdir /tmp/pulsarcql

wget https://raw.githubusercontent.com/pulsarIO/realtime-analytics/master/metriccalculator/pulsar.cql -O /tmp/pulsarcql/pulsar.cql

sudo docker run -it --rm --link cassandraserver:cass1 -v /tmp/pulsarcql:/data poklet/cassandra bash -c 'cqlsh $CASS1_PORT_9160_TCP_ADDR -f /data/pulsar.cql'

echo '>>> Sleep 10 seconds'
sleep 10

echo '>>> Start Pulsar pipeline'

sudo docker run -d -p 0.0.0.0:8000:9999 -p 0.0.0.0:8081:8080 --link zkserver:zkserver --link mongoserver:mongoserver -t "jetstream/config"
sleep 5

sudo docker run -d -p 0.0.0.0:8001:9999 --link zkserver:zkserver --link mongoserver:mongoserver --link kafkaserver:kafkaserver -t "pulsar/replay"
sleep 5

sudo docker run -d -p 0.0.0.0:8003:9999 --link zkserver:zkserver --link mongoserver:mongoserver --link kafkaserver:kafkaserver -t "pulsar/sessionizer"
sleep 5

sudo docker run -d -p 0.0.0.0:8004:9999 --link zkserver:zkserver --link mongoserver:mongoserver --link kafkaserver:kafkaserver -t "pulsar/distributor"
sleep 5

sudo docker run -d -p 0.0.0.0:8005:9999 --name metriccalculator --link zkserver:zkserver --link mongoserver:mongoserver --link kafkaserver:kafkaserver  --link cassandraserver:cassandraserver -t "pulsar/metriccalculator"
sleep 5

sudo docker run -d -p 0.0.0.0:8002:9999 -p 0.0.0.0:8080:8080 --link zkserver:zkserver --link mongoserver:mongoserver --link kafkaserver:kafkaserver -t "pulsar/collector"
sleep 5

echo '>>> Start demo'

sudo docker run -d -p 0.0.0.0:8006:9999 -p 0.0.0.0:8083:8083 --name metricservice --link zkserver:zkserver --link mongoserver:mongoserver --link cassandraserver:cassandraserver -t "pulsar/metricservice"
sleep 5

sudo docker run -d -p 0.0.0.0:8007:9999 -p 0.0.0.0:8088:8088 --link zkserver:zkserver --link mongoserver:mongoserver --link metricservice:metricservice --link metriccalculator:metriccalculator -t "pulsar/metricui"

# The twitter sample use the twitter4j api, to run the app, it requires twitter OAUTH token (https://dev.twitter.com/oauth/overview/application-owner-access-tokens)

#sleep 5

#sudo docker run -d -p 0.0.0.0:8008:9999 --link zkserver:zkserver --link mongoserver:mongoserver -e TWITTER4J_OAUTH_CONSUMERKEY= -e TWITTER4J_OAUTH_CONSUMERSECRET=  -e TWITTER4J_OAUTH_ACCESSTOKEN=  -e TWITTER4J_OAUTH_ACCESSTOKENSECRET= -t pulsar/twittersample

#sleep 5



실행하기


dependency docker container 실행하기


1. zookeeper 실행하기

sudo docker run -d --name zkserver -t "jetstream/zookeeper"


2. mongo 실행하기

sudo docker run -d --name mongoserver -t "mongo"


3. kafka 실행하기

sudo docker run -d --name kafkaserver -t "jetstream/kafka"


4. Cassandra 실행하기

sudo docker run -d --name cassandraserver -t "poklet/cassandra"


Cassandra Tables 와 keyspace 생성하기


1. table을 설치하기 위하여 CQL Client를 실행하기

sudo docker run -it --rm --link cassandraserver:cass1 -v $PATH_CQL:/data poklet/cassandra bash -c 'cqlsh $CASS1_PORT_9160_TCP_ADDR -f /data/pulsar.cql'


2. Pulsar init CQL파일 : pulsar.cql을 적용한다.


Config app과 replay app 실행하기


1. Config 서버 실행하기

sudo docker run -d -p 0.0.0.0:8000:9999 -p 0.0.0.0:8081:8080 --link zkserver:zkserver --link mongoserver:mongoserver -t "jetstream/config"


2. Replay app 실행하기

sudo docker run -d -p 0.0.0.0:8001:9999 --link zkserver:zkserver --link mongoserver:mongoserver --link kafkaserver:kafkaserver -t "pulsar/replay"


Pipeline app 실행하기


1. Collector 실행하기

sudo docker run -d -p 0.0.0.0:8002:9999 -p 0.0.0.0:8080:8080 --link zkserver:zkserver --link mongoserver:mongoserver --link kafkaserver:kafkaserver -t "pulsar/collector"


2. Sessionizer 실행하기

sudo docker run -d -p 0.0.0.0:8003:9999 --link zkserver:zkserver --link mongoserver:mongoserver --link kafkaserver:kafkaserver -t "pulsar/sessionizer"


3. Distributor 실행하기

sudo docker run -d -p 0.0.0.0:8005:9999 --link zkserver:zkserver --link mongoserver:mongoserver --link kafkaserver:kafkaserver -t "pulsar/distributor"


4. Metric Calculator 실행하기

sudo docker run -d -p 0.0.0.0:8006:9999 --name metriccalculator --link zkserver:zkserver --link mongoserver:mongoserver --link kafkaserver:kafkaserver --link cassandraserver:cassandraserver -t "pulsar/metriccalculator"


Demo app 실행하기


1. MetricService 실행하기

sudo docker run -d -p 0.0.0.0:8006:9999 -p 0.0.0.0:8083:8083 --name metricservice --link zkserver:zkserver --link mongoserver:mongoserver --link cassandraserver:cassandraserver -t "pulsar/metricservice"


2. MetricUI 실행하기

sudo docker run -d -p 0.0.0.0:8007:9999 -p 0.0.0.0:8088:8088 --link zkserver:zkserver --link mongoserver:mongoserver --link metricservice:metricservice --link metriccalculator:metriccalculator -t "pulsar/metricui"


3. twittersample 실행하기

Twittersample은 twitter oauth token이 필요하다. 아래의 링크에서 token값을 얻어서 적용하면 된다.

https://dev.twitter.com/oauth/overview/application-owner-access-tokens

sudo docker run -d -p 0.0.0.0:8008:9999 --link zkserver:zkserver --link mongoserver:mongoserver -e TWITTER4J_OAUTH_CONSUMERKEY= -e TWITTER4J_OAUTH_CONSUMERSECRET= -e TWITTER4J_OAUTH_ACCESSTOKEN= -e TWITTER4J_OAUTH_ACCESSTOKENSECRET= -t pulsar/twittersample Twittersample requires twitter oauth token, seehttps://dev.twitter.com/oauth/overview/application-owner-access-tokens


Pipeline app 모니터링 하기


각 앱은 http port 로 모니터링 가능하다.

1. Replay - http://<hostname>:8001

2. Collector - http://<hostname>:8002, Collector Rest end point -  http://<hostname>:8080

3. Sessionizer - http://<hostname>:8003

4. Distributor - http://<hostname>:8004

5. MetricCalculator - http://<hostname>:8005

6. Configuration - http://<hostname>:8000, Configuration UI  - http://<hostname>:8081

7. Query data via CQL Client: sudo docker run -it --rm --link cassandraserver:cass "poklet/cassandra" cqlsh cass향향

8. MetricService - http://<hostname>:8006

9. MetricUI - http://<hostname>:8007, Dashboard port: http://<hostname>:8088

10. TwitterSample - http://<hostname>:8008



Distributed deployment


Pulsar app이 실행되고 있는 분산환경에서는 app container를 실행시킬 경우 zkserver와 mongoserver에 파라미터처럼 전달해야 한다. Pulsar app이 container host network에 직접 바인딩 할 수 있게 해야함과 동시에 각 app들은 다른 host에 전달해야 한다.


Dependency docker container 실행하기


1. zkServer 실행하기

sudo docker run -d -p 0.0.0.0:2181:2181 -t "jetstream/zookeeper"


2. mongo 실행하기

sudo docker run -d -p 0.0.0.0:27017:27017 -t "mongo"


3. kafka 실행하기

sudo docker run -d -p 0.0.0.0:9092:9092 -p 0.0.0.0:2181:2181 -t "jetstream/kafka"


4. cassandra 실행하기

sudo docker run -d -p 0.0.0.0:9106:9160 -p 0.0.0.0:22:22 -p 0.0.0.0:61621:61621 -p 0.0.0.0:7000:7000 -p 0.0.0.0:7001:7001 -p 0.0.0.0:7199:7199 -p 0.0.0.0:8012:8012 -p 0.0.0.0:9042:9042 -t "poklet/cassandra"


Config app과 Replay app 실행하기


1. Config server 실행하기

sudo docker run -d --net=host -e JETSTREAM_ZKSERVER_HOST="zkserverip" -e JETSTREAM_MONGOURL="mongo://mongoserverip:27017/config" -t "jetstream/config"


2. Replay app 실행하기

sudo docker run -d --net=host -e JETSTREAM_ZKSERVER_HOST="zkserverip" -e JETSTREAM_MONGOURL="mongo://mongoserverip:27017/config" -e PULSAR_KAFKA_ZK="kafkazkconn" -e PULSAR_KAFKA_BROKERS="kafkaborkers" -t "pulsar/replay"


Pipeline app 실행하기


1. Collector 실행하기

sudo docker run -d --net=host -e JETSTREAM_ZKSERVER_HOST="zkserverip" -e JETSTREAM_MONGOURL="mongo://mongoserverip:27017/config" -e PULSAR_KAFKA_BROKERS="kafkaborkers" -t "pulsar/collector"


2. Sessionizer 실행하기

sudo docker run -d --net=host -e JETSTREAM_ZKSERVER_HOST="zkserverip" -e JETSTREAM_MONGOURL="mongo://mongoserverip:27017/config" -e PULSAR_KAFKA_BROKERS="kafkaborkers" -t "pulsar/sessionizer"


3. Distributor 실행하기

sudo docker run -d --net=host -e JETSTREAM_ZKSERVER_HOST="zkserverip" -e JETSTREAM_MONGOURL="mongo://mongoserverip:27017/config" -e PULSAR_KAFKA_BROKERS="kafkaborkers" -t "pulsar/distributor"


4. Metriccalculator 실행하기

sudo docker run -d --net=host -e JETSTREAM_ZKSERVER_HOST="zkserverip" -e JETSTREAM_MONGOURL="mongo://mongoserverip:27017/config" -e PULSAR_KAFKA_BROKERS="kafkaborkers" -e PULSAR_CASSANDRA="cassandraseeds" -t "pulsar/metriccalculator"


Demo app 실행하기


1. MetricService 실행하기

sudo docker run -d --net=host -e JETSTREAM_ZKSERVER_HOST="zkserverip" -e JETSTREAM_MONGOURL="mongo://mongoserverip:27017/config" -e PULSAR_CASSANDRA="cassandraserverip" -t "pulsar/metricservice"


2. MetricUI 실행하기

sudo docker run -d --net=host -e JETSTREAM_ZKSERVER_HOST="zkserverip" -e JETSTREAM_MONGOURL="mongo://mongoserverip:27017/config" -e METRIC_SERVER_HOST="metricserverip" -e METRIC_CALCULATOR_HOST="metriccalculatorserverip" -t "pulsar/metricui"


3. twittersample 실행하기

Twittersample은 twitter oauth token이 필요하다. 아래의 링크에서 token값을 얻어서 적용하면 된다.

https://dev.twitter.com/oauth/overview/application-owner-access-tokens

sudo docker run -d --net=host -e JETSTREAM_ZKSERVER_HOST="zkserverip" -e JETSTREAM_MONGOURL="mongo://mongoserverip:27017/config" -e TWITTER4J_OAUTH_CONSUMERKEY= -e TWITTER4J_OAUTH_CONSUMERSECRET= -e TWITTER4J_OAUTH_ACCESSTOKEN= -e TWITTER4J_OAUTH_ACCESSTOKENSECRET= -t pulsar/twittersample 


EC2 deplyment


EC2에 적용하는 법은 https://docs.docker.com/installation/amazon/ 에서 docker 설치 방법을 참고한 후, 위의 스텝을 실행해보면 된다.



이번 포스팅에서는 Pulsar 설치와 실행을 정리해 보았다. 

Pulsar는 모든 app을 Docker 이미지로 만들어서 배포하고 있기때문에 매우 간단하게 설치 및 실행이 가능하다. 또한 클라우드 배포도 지원하기 때문에 Docker를 사용할 수 있는 instance에서는 쉽게 설치 및 사용할 수 있다고 한다. 


다음 포스팅에서는 Pulsar에서 제공하는 White Paper를 정리해보기로 하면서 이번 포스팅을 마친다.


참고자료 : https://github.com/pulsarIO/realtime-analytics/wiki/Get-Started



Posted by 알 수 없는 사용자
,

최근 누구나 한번쯤은 드론(Drone), 웨어러블 디바이스 (Wearable Device) 와 더불어 사물 인터넷 (IoT : Internet of Things) 이라는 것을 들어보았을 것이다.

드론이나 삼성의 갤럭시 기어, Fitbit이 바로 사물인터넷을 기반으로한 제품들이다.

그렇다면 사물인터넷 (IoT : Internet of Things) 이란 무엇일까?


Internet of THINGS (사물 인터넷)


The Internet of Things (IoT) is the network of physical objects or "things" embedded with electronics, software, sensors and connectivity to enable it to achieve greater value and service by exchanging data with the manufacturer, operator and/or other connected devices. Each thing is uniquely identifiable through its embedded computing system but is able to interoperate within the existing Internet infrastructure.

사물 인터넷(Internet of Things, 약어로 IoT)은 물건들 또는 전자제품, 소프트웨어, 센서 그리고 연결된 장치의 양쪽 혹은 어느 한 쪽의 가공, 연산된 데이터를 교환 함으로써 더 큰 가치와 서비스를 달성하기 위한 연결을 가능케하는 사물들의 네트워크이다. 각 사물은 각각의 임베디드 컴퓨팅 시스템을 통해서 고유하게 식별하지만 기존에 존재하던 상호연동이 가능한 인터넷 인프라에서도 가능하다.

[출처 : Wikipedia]


Wikipedia에 따르면 '사물들의 네트워크' 라고 정의 하고 있다. 네트워크로 연결되어 상용화된 첫 기기는 바로 컴퓨터 였다. 이후 Smart Phone 을 거쳐 현재 'Things' 즉, 특정 되지 않은 각종 사물에 도달한 것이다. 

이런 IoT 활용 기기가 어떤 것들이 있는지 우선 드론(Drone)인 Lily와 웨어러블 디바이스(Wearable Device)인 Fitbit의 제품에 대한 아래 영상을 통해 살펴보자.


[동영상] LILY 소개 영상 (출처 : https://www.lily.camera/)


[동영상] Fitbit surge 소개 영상 (출처 : https://www.fitbit.com/kr/surge )


두 영상을 보고 필자는 신기함, 흥미로움과 같은 감정과 함께 2002년 개봉 했던 마이너리티 리포트 라는 영화의 한 장면이 뇌리를 스쳤다. 영화를 보면 주인공인 톰 크루즈가 광고판 앞을 지나가자 광고판이 톰 크루즈를 알아보고 맞춤형 광고를 보여주는 장면이었다. 이는 IoT 기술을 표현 할만한 좋은 예가 되는 장면이라고 생각한다. 우리는 지금 영화의 내용이 그저 상상이 아닌 현실이 되는 시대에 살고 있는 것이다. 그렇다면 IoT(Internet of Things : 사물인터넷)는 꼭 필요한 것일까?

누군가는 "저런거 없어도 살수 있다." 혹은 "저런게 꼭 필요한가?" 라고 말할 것이다. 시장조사업체인 IHS 테크놀러지는 인터넷에 연결된 사물은 2014년 기준 200억개에 달하고 있고 10년뒤인 2024년에는 약 800억개에 달할 것으로 전망하고 있다. 또한 Apple사는 2015년 6월에 있을 발표를 겨냥해 'Home-kit을 주목해주세요.' 라고 했다. IoT에 대해 '없어도 살 수 있다?' 맞는 말일 수 있다. 하지만 있으면 삶의 질은 향상될 것이다. Internet of Computer에서 Internet of IPhone을 넘어 이제는 Internet of Things의 시대가 올것이다.

그렇다면 이제 IoT 기술에 대해 조금더 자세히 알아보자.

현재 IoT 기술을 이용한 제품은 어떤 것이 있을까?

http://iotlist.co/ 링크된 곳은 IoTList라는 사이트로 아래와 같이 IoT 기술을 이용한 다양한 제품을 소개 및 판매하고 있다.

 

[사진] iotlist의 다양한 제품들 (출처 : http://iotlist.co/)

IoTList에서 소개 하고 있는 제품들을 분류 해보면 다음과 같다.

 1. Home

 

 3. Etc

 - Environmental factor

 

 - Art screen

 - Air condition

 

 - Cooking

 - management

 

 - Media

 - Thermostat

 

 - Plants garden

 - Electrical usage

 

 - Sprinkler

 - Bulb

 

 - Fuel gauge

 - Remote control

 

 - Computer mouse

 - Security

 

 - Payment

 - Door lock

 

 - Fish finder

 - Security 

 

 - Glasses

 2. Healthy

 

 - Chromecast

 - Temperature

 

- Pet tracker 

 - Blood pressure

 

 

 - Scale

 

 

 - Breathalyzer

 

 

 - Sleeping

 

 

 - Heart beat

  

 - Brainwave

  

 - Fitness tracker

  

우리 생활에 밀접한 관계가 있는 제품들이 많은 것을 볼 수 있다. IoT는 우리 생활에 많이 다가와 있는 것이다. 

위의 제품분류에서는 IoTList 사이트의 제품군만 분류 해놓았지만 이 밖에도 다양한 제품들이 많이 출시되어 판매되고 있고 

각국에서는 관련 사업도 추진되고 있다. 


그렇다면 IoT 개발에 필요한 것들은 무엇이 있을까?


우선 IoT가 어떤 기술 요소들로 구성 되어있는지 알아보자.

1. Machine & Module

- Sensor

- Embedded

2. Network

- 근거리 : NFC, Bluetooth, Beacon, Zigbee

- 원거리 : HTTP, MQTT

- Security

3. Data processing

- Event processing & Messaging Middleware

- Data processing & analysis

4. Service

- Cloud computing


sensor와 embedded 단말을 통해 data를 수집 하고  취합 및 전송하기 위한 Machine 과 module

센서와 임베디드 혹은 단말과 서버 사이의 통신과 데이터 전송을 위한 근거리/원거리 네트워크

전송된 데이터의 분석 및 필요한 정보 추출을 위한 Data processingCloud computing서비스 부분으로 나누어 볼 수 있다.

IoT의 기술 요소의 구성에 대해 알아 보았다. 


그렇다면 이번에는 IoT 관련 오픈 소스들에 대해 알아보자.

    1. Development Tools

      1. Arduino

        • 데스크탑 컴퓨터 보다 더 많은 물리적인 것들을 제어 및 감지할 수 있는 컴퓨터를 만들기 위한 Tool이다.

      1. Eclipse IoT Project

        • Eclipse 에서 지원하는 IoT 관련 프로젝트이다. 프로젝트는 application framework와 IoT의 프로토콜 구현관련 오픈소스, Lua에서 작업하기위한 tool과 같은 서비스를 포함하고있다.

      1. Kinoma

        • javascript로 된 smart device와 모바일 app개발을 원하는 개발자 및 전문 디자이너를 위한 tool(software & hardware)과 device app 플랫폼이다.

      1. M2MLabs Mainspring(Machine to machine)

        • 원격 모니터링, 차량 관리나 Smart grid 와 같은 응용프로그램 머신 (M2M)의 시스템 구축을 위한 application framework 오픈소스 이다.

      1. Node-RED

        • Hardware devices의 연결 관계를 나타내는데 사용되는 Tool이다. Raspberry Pi에서 실행할 수있다.


    1. Hardware

      1. Arduino Yun

        • Arduino의 microcontroller board의 한 가지로 linux OS 를 지원한다. 또한 Ethernet, Wifi 장치, usb-a 포트와 micro-SD카드 슬롯, 20 digital 입출력 핀을 지원한다. IoT에 사용 되는 기판 컴퓨터이다.

      1. BeagleBoard

        • BeagleBoard는 Open Source Computing 을 위한 기판 컴퓨터를 제작하는 회사로 대표적인 제품은 BeagleBone Black이 있다.

      1. Flutter

        • Arduino 기반의 board에 호환되는 무선 통신을 위한 장치 hardware 이다.

      1. Local Motors Connected Car

        • 자동차 회사인 Local Motors에서 IBM & Intel via Joe Speed가 협력해 만든 Open Source 하드웨어 이다.

      1. Microduino

        • Arduino  ¼ 크기의 축소판인 microcontroller board 이다.

      1. OpenPicus

        • IoT 장치들의 통신을 위한 Kit와 모듈을 만드는 회사로 Wi-fi, GPRS(General Pack Radio service), Ethernet을 이용할 수 있는 시스템 모듈인 FlyportPRO이 있다.

      1. Pinoccio

        • Arduino의 축소판인 Open Source hardware 이다. Arduino IDE (통합 개발 환경)와 Arduino의 라이브러리를 사용해 프로그래밍 할 수 있다.

      1. RasWIK

        • Raspberry Pi Wireless Inventors Kit 으로 Raspberry pi에 연결해 wi-fi 기능을 이용할 수 있도록 해준다

      1. SODAQ

        • Solar-Powered Data Acquisition의 약자로 plug-in module과 같은 Lego를 함께 제공하는 Arduino 기반의 board이다.

      2. Tessel

        • 10-pin Module 로 Accelerometer(가속도계), Ambient (소음측정), Relay(계전기), Climate(기후), Infrared(적외선), servo, RFID, GPS, DIY와 관련된 Open source Library를 제공 한다.

        • USB Modul로는 Bluetooth, Cellular, MicroSD, Camera, Audio를 제공한다.

        • Community-Created Module로는 Distance, Color Sensor, Keypad, Lights/LED, Motion, Motors, Pulse, Screen, Button/Switch를 제공 한다.

      1. UDOO

        • 안드로이드와 Linux 두가지에서 사용이 가능하고 Arduino-compatible 프로세서를 장착한 single board computer 이다. 소프트웨어 개발과 디자인을 위한 강력한 prototyping board이다.

    1. Home Automation System

      • home에서 사용하는 IoT 기기를 제어 할 수있도록 도와주는 소프트웨어이다.

      1. OpenHAB

      2. TheThing System


    1. Middleware

      1. IoTSyS

        • 장치간 통신을 위한 미들웨어로 IPv6, oBIX,6LoWPAN, 제한된 응용 프로토콜과 같은 다양한 표준과 프로토콜을 지원한다.

      2. OpenIoT

        • 센서 cloud로 부터 얻은 정보를 다루기위한 오픈소스 미들웨어이다.


    1. Operating Systems

      1. AllJoyn

      2. Contiki

      3. Raspbian

      1. RIOT

      2. Spark

    1. Monitoring

      1. Freeboard

        • Air Quality, Distillery, Humidor, Residental과 관련된 widget을 제공한다.


    1. Printing

      1. Exciting Printer

        • Small Internet-connected Printer 이다.

    1. Platform and Integration Tools

      1. DeviceHive

      2. Devicehub.net

      3. IoT Toolkit

      4. Mango

      5. Nimbits

      6. OpenRemote

      7. SiteWhere

      8. ThingSpeak


[자료] IoT를 위한 35 가지 Open Source 

(출처 : http://www.datamation.com/open-source/35-open-source-tools-for-the-internet-of-things-1.html )



위의 Open Source들에 대한 자세한 내용은 (출처 : http://www.datamation.com/open-source/35-open-source-tools-for-the-internet-of-things-1.html )에서 각 항목의 사이트 링크를 통해 살펴볼 수 있다.

IoT와 관련된 오픈소스는 이밖에도 많이 있다. 이러한 오픈소스들은 IoT관련 개발을 손쉽게 접하도록 도와준다. IoT 개발에 관심이 있다면 Arduino 혹은 Raspberry Pi의 홈페이지에서 제공하고 있는 Project Example을 활용 하면 좋을 것이다.


마무리

지금 까지 IoT에 대해 전반적으로 살펴 보았다. 

오래전부터 인간은 도구를 사용해 왔다. 도구를 사용하지 않았어도 인간은 살아갈 수는 있었을 것이다. 하지만 도구의 사용은 인간의 삶의 질을 향상 시켜 주었고, 생활의 편리함을 제공해 주었다. 더불어 더욱 편리해 지기위한 필요에 의해 도구는 발전을 거듭해 왔다. 

IoT 기술도 마찬가지이다. IoT 기술이 없어도 살아갈 수 있지만 이 기술을 활용 하면 인간은 지금보다 더 좋은 환경에서 생활 할 수 있을 것이다. 또한 IoT 기술이 생겨나고 발전 할 수 있었던 것은 사람들이 필요로 했기 때문이다. IoT 시대는 이미 시작 되었다. IoT는 무궁무진한 발전 가능성을 가지고 있고 관련 자료들이 지금도 쏟아져 나오고있다. 위에서 소개한 IoT 관련 Open Source 및 기타 자료들은 IoT의 극히 일부에 불과하다. 

하지만 이번 포스팅을 통해 IoT 가 무엇인지 알고 싶어 하는 사람들에게 조금이라도 도움이 되었길 바란다.

IoT 에 입문하기 위한 혹은 IoT가 어떤 것인지 알고 싶은 사람들을 위한 이번 'IoT(Internet of Things : 사물인터넷) ?' 에 대한 포스팅을 마치겠다.









Posted by 알 수 없는 사용자
,

이번 포스팅은 IoT를 위한 오픈 소스 개발 툴중에 하나인 Kinoma를 소개하고자 한다.

Kinoma는 Marvell Technology Group소유의 소프트웨어 플랫폼으로써 각기 다른 세개의 오픈소스 프로젝트를 포함하고 있다.

1. Kinoma Create은 프로토타입의 전자 기기를 위한 DIY키트이다. 

2. Kinoma Studio는 Kinoma Create과 Kinoma Platform Runtime에서 사용할 수 있는 개발 툴이다. 

3. Kinoma Connect는 스마트폰 또는 타블렛과 IoT 기기를 연결해주는 무료 iOS, Android앱이다.


이중에서 우리는 두번째에 있는 Kinoma Studio를 살펴보도록 하겠다.


Kinoma Studio



Kinoma Studio는 어플리케이션 프로그래밍 툴이다.

자바스크립트와 XML로 어플리케이션 작성을 할 수 있다. XML API 옵션은 유저인터페이스와 데이터 바인딩을 간단하게 해 준다고 한다. Node.js가 자바스크립트를 사용하지만 "웹" 부분을 서버로 사용하기 위한 프레임워크로 바꿔서 사용하듯이, Kinoma Platform Runtime(KPR)은 Kinoma Create, iOS, Android에서 사용될 고성능 앱을 구축하기 위하여 프레임워크를 최적화 한다.

Eclipse open source IDE에 Built-on된 Kinoma Studio는 개발자에게 친숙한 환경을 제공한다. 

Built-in 시뮬레이터가 있어서 키트가 없어도 즉시 코딩 가능하다. 또한, 수많은 예제들을 제공하여, 개발하고자 하는것과 관련된 예제들은 바로 테스트 가능하다.

Kinoma Stydio는 Kinoma Create App이나 iOS App, Android App으로 쉽게 Export 할 수 있다. 


설치

설치는 http://kinoma.com/studio/ 에서 각 OS에 맞는 버전을 설치하면 된다.


좀더 들여다 보기

이번에는 간단한 프로젝트를 실행해 보겠다.

버튼을 클릭(터치)할때마다 "Hello!"와 "World!"가 번갈아가면서 나오게 하기

1. 프로젝트를 생성하고, main.xml파일을 다음과 같이 작성해 준다.


main.xml


<?xml version="1.0" encoding="utf-8"?>

<!--

 Copyright 2011-2014 Marvell Semiconductor, Inc.

 Licensed under the Apache License, Version 2.0 (the "License");  you may not use this file except in compliance with the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software  distributed under the License is distributed on an "AS IS" BASIS,  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the specific language governing permissions and  limitations under the License. -->

<program xmlns="http://www.kinoma.com/kpr/1">

<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++ --> <!-- ASSETS --> <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++ -->

<skin id="MainSkin" color="#FFFFFF"/>

<skin id="ButtonSkin" color="#707070"/>

<skin id="ButtonSkinPressed" color="#4E4E4E"/>


<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++ -->

<!-- STYLES -->

<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++ -->

<style id="ButtonStyle" color="white" font="bold 36px Helvetica, sans-serif"/>

 

<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++ -->

<!-- LAYOUTS -->

<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++ -->  


   <container id="MainContainer" top="0" left="0" bottom="0" right="0" skin="MainSkin" active="true">    

       <container top="100" left="100" bottom="100" right="100" skin="ButtonSkin" active="true">

           <label top="0" left="0" bottom="0" right="0" string="'Hello!'" style="ButtonStyle"/>    

           <behavior>

               <method id="onTouchBegan" params="container, id, x, y, ticks"><![CDATA[

                   container.skin = ButtonSkinPressed;

                   /* Turn led on/off and switch the button's label */

                   if ( ledState ) {

                container.first.string = "Hello!";                

                } else {

                container.first.string = "World!";

                }

                   ledState = !ledState;                    

               ]]></method>

               <method id="onTouchEnded" params="container, id, x, y, ticks"><![CDATA[

                   container.skin = ButtonSkin;                      

               ]]></method>

           </behavior>       

       </container>

   </container>

   

   <script><![CDATA[

        

    /* Global Variables */

var ledState = false;

/* Start application */

      var main = new MainContainer();

       application.add( main );       

/* Same as

application.add(new MainContainer());       

*/

         

   ]]></script>

</program>


2. 실행하기 
프로젝트의 Run Configuration에서 원하는 프로젝트 경로와 시뮬레이터를 선택 후 실행해준다. 시뮬레이터는 application.xml에서도 지정 가능하다.

<이미지 1. applicaiton.xml>


<이미지 2. 세가지의 시뮬레이터를 선택할 수 있다.>

<이미지3. 실행 설정>

3. 각 시뮬레이터에서 실행 된 모습.

<이미지 4. Desktop Application 시뮬레이터>

<이미지 5. Kinoma Create 시뮬레이터>

<이미지 6. Nexus One 시뮬레이터>

마무리

IoT에대한 관심이 높아지는 요즘, Kinoma Studio는 가상 시뮬레이터를 제공해 주기때문에 실제 키트가 없더라도 IoT관련 개발을 손쉽게 접할 수 있을것 같다. 더구나 개발 언어가 자바스크립트와 XML이기 때문에 웹을 하던 사람들도 익숙하게 개발 할 수 있을것 같다. 또, eclipse IDE환경을 제공하여 친숙한 환경에서 개발 할 수 있어 진입장벽이 낮은것 같다. 

IoT 입문자 또는 관련 앱을 개발하고 싶은사람에게 적극 추천해주고 싶은 Kinoma Studio에 대해 이번포스팅을 마치겠다.

Posted by 알 수 없는 사용자
,

Google Analytics 데이터를 사용한 엠비안 블로그 분석 보고서.

012345678910111213141516171819202122

SlideShare: http://www.slideshare.net/JungKim12/20150424-48080561


'Newbie's Log' 카테고리의 다른 글

IoT(Internet of Things : 사물인터넷) ?  (0) 2015.05.21
IoT 오픈소스 개발 툴 - Kinoma  (0) 2015.05.20
spring camp 2015 참가 후기  (0) 2015.04.13
naver pinpoint  (0) 2015.03.07
데이터 분석이 게임 성패를 가른다.  (0) 2015.03.01
Posted by 알 수 없는 사용자
,