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 알 수 없는 사용자
,