View

 Apache Storm에 자세히 알아보기에 앞서 개발환경을 구성하고 platform을 구성하여 간단한 예제를 수행해 보도록하자. 
이를 통해서 대략적으로 storm의 구성이나 동작들을 유추할 수 있다. 

1. VM 환경구성 :

Apache Storm은 CentOS7에 distributed cluster가 아닌 local mode로 설치할 인데, 이는 테스트와 개발용도로 자주 사용된다. Virtual box 위에 centOS7를 올리고, putty를 통해서 SSH로 접속하였다. 기본적인 OS 환경설정이 궁금하다면 다음을 참고하라. (링크예정)


2. Zookeeper 구성 :

Apache Storm을 local mode로 구성하더라도 내부적으로 fast-fail처리를 수행하기 위해서 Apache Zookeeper가 설치되어야 하며, JDK 1.8 이상의 버전이 권고된다. Apache Zookeeper를 최신버전으로 다운로드 받아도 무관하나, 호환성 점검을 위해 ZooKeeper 3.4.6 버전을 설치하고 구성하였다. (링크예정)

1
2
3
4
5
6
7
8
[root@localhost media]# cd /media
[root@localhost media]# curl -O http://apache.tt.co.kr/zookeeper/zookeeper-3.4.6/zooke                                       eper-3.4.6.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 16.8M  100 16.8M    0     0  1010k      0  0:00:17  0:00:17 --:--:--  901k
[root@localhost media]# ls
zookeeper-3.4.6.tar.gz
 
cs


그 다음으로 zookeeper 사용자를 생성하고 패스워드를 초기화한다. 

1
2
3
4
5
6
7
8
[root@localhost media]# adduser zookeeper -d /usr/zookeeper
[root@localhost media]# passwd zookeeper
zookeeper 사용자의 비밀 번호 변경 중
새  암호:
잘못된 암호: 암호에 어떤 형식으로 사용자 이름이 포함되어 있습니다
새  암호 재입력:
passwd: 모든 인증 토큰이 성공적으로 업데이트 되었습니다.
 
cs


생성한 zookeeper 사용자의 환경변수를 설정하고, zookeeper 사용자의 home dir에 다운로드 받은 zookeeper tarball을 압축해제 한다. 

[root@localhost media]# su - zookeeper
[zookeeper@localhost ~]$ tar xvf /media/zookeeper-3.4.6.tar.gz
[zookeeper@localhost conf]$ cd /usr/zookeeper/zookeeper-3.4.6/conf
[zookeeper@localhost conf]$ ls
configuration.xsl log4j.properties zoo_sample.cfg
[zookeeper@localhost conf]$ cp zoo_sample.cfg zoo.cfg
[zookeeper@localhost conf]$ vi zoo.cfg

zoo.cfg는 zookeeper의 설정파일이며 간단하게 다음 값을 변경시킨다. 

1
dataDir=/usr/zookeeper/data
cs


3 Apache Storm 구성 :

Apache Storm release를 다운받는다. 원하는 버전 아무거나 다운받아도 상관 없으나, 이 글에서는 Storm 1.1.0 버전을 기준으로 작성하였다. Windows에서 다운로드받아서 VM에 FTP/SFTP 전송을 해도 상관은 없으나, CentOS7 에서 아래와 같이 직접 다운로드도 가능하다.

1
2
3
4
5
6
7
8
[root@localhost media]# cd /media
[root@localhost media]# curl -O http://apache.mirror.cdnetworks.com/storm/apache-storm-1.1.0/apache-storm-1.1.0.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 79.4M  100 79.4M    0     0  2687k      0  0:00:30  0:00:30 --:--:-- 2422k
[root@localhost media]# ls
apache-storm-1.1.0.tar.gz  zookeeper-3.4.6.tar.gz
[root@localhost media]
cs

Storm을 수행할 user를 생성하고 사용자 비밀번호를 설정한다.

[root@localhost media]# adduser storm -d /usr/storm
[root@localhost media]# passwd storm
storm 사용자의 비밀 번호 변경 중
새 암호:
잘못된 암호: 암호는 8 개의 문자 보다 짧습니다
새 암호 재입력:
passwd: 모든 인증 토큰이 성공적으로 업데이트 되었습니다.

신규로 생성한 사용자(storm) 의 home dir에 다운받은 apache-storm-1.1.0.tar.gz 를 압축해제한다.

1
2
[root@localhost media]# su - storm
[storm@localhost ~]$ tar xvf /media/apache-storm-1.1.0.tar.gz
cs


storm 사용자의 환경변수를 설정한다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# .bash_profile
 
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
 
# User specific environment and startup programs
 
export JAVA_HOME=/usr/java/jdk1.8.0_144
export STORM_HOME=/usr/storm/apache-storm-1.1.0
PATH=$JAVA_HOME/bin:$STORM_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin
 
export PATH
 
cs

변경된 환경변수를 적용하고 확인한다.

1
2
3
4
[storm@localhost ~]$ source .bash_profile
[storm@localhost ~]$ which storm
~/apache-storm-1.1.0/bin/storm
 
cs


4. Storm 서비스 기동 : 

앞서 말한 것과 같이 Storm을 구동시키기 위해선 Zookeeper를 먼저 구동할 필요가 있다. 

1
2
3
4
5
6
7
8
9
[zookeeper@localhost ~]$ su - zookeeper
[zookeeper@localhost ~]$ zkServer.sh start
JMX enabled by default
Using config: /usr/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[zookeeper@localhost ~]$ jps
4066 QuorumPeerMain
4091 Jps
 
cs


그 다음으로 storm nimbus 프로세스를 구동시킨다. Nimbus는 storm node들 사이에서 master의 역할을 수행한다. 자세한 사항은 차후 설명될 것이다. Nimbus는 앞서 기동한 Zookeeper server(process)와 I/F를 수행하면서 storm의 worker node인 Supervisor에게 Topology를 배포한다. 아래는 Nimbus와 Supervisor 프로세스를 기동하고, 모니터링을 위한 ui 프로세스까지 기동하는 것 이다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[zookeeper@localhost ~]$ su - storm
[storm@localhost ~]$ storm nimbus & 
[storm@localhost ~]$ Running: /usr/java/jdk1.8.0_144/bin/java -server -Ddaemon.name=nimbus -Dstorm.options= -Dstorm.home=/usr/storm/apache-storm-1.1.0 -Dstorm.log.dir=/usr/storm/apache-storm-1.1.0/logs -Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib -Dstorm.conf.file= -cp /usr/storm/apache-storm-1.1.0/lib/storm-core-1.1.0.jar:/usr/storm/apache-storm-1.1.0/lib/kryo-3.0.3.jar:/usr/storm/apache-storm-1.1.0/lib/reflectasm-1.10.1.jar:/usr/storm/apache-storm-1.1.0/lib/asm-5.0.3.jar:/usr/storm/apache-storm-1.1.0/lib/minlog-1.3.0.jar:/usr/storm/apache-storm-1.1.0/lib/objenesis-2.1.jar:/usr/storm/apache-storm-1.1.0/lib/clojure-1.7.0.jar:/usr/storm/apache-storm-1.1.0/lib/ring-cors-0.1.5.jar:/usr/storm/apache-storm-1.1.0/lib/disruptor-3.3.2.jar:/usr/storm/apache-storm-1.1.0/lib/log4j-api-2.8.jar:/usr/storm/apache-storm-1.1.0/lib/log4j-core-2.8.jar:/usr/storm/apache-storm-1.1.0/lib/log4j-slf4j-impl-2.8.jar:/usr/storm/apache-storm-1.1.0/lib/slf4j-api-1.7.21.jar:/usr/storm/apache-storm-1.1.0/lib/log4j-over-slf4j-1.6.6.jar:/usr/storm/apache-storm-1.1.0/lib/servlet-api-2.5.jar:/usr/storm/apache-storm-1.1.0/lib/storm-rename-hack-1.1.0.jar:/usr/storm/apache-storm-1.1.0/conf -Xmx1024m -Dlogfile.name=nimbus.log -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -Dlog4j.configurationFile=/usr/storm/apache-storm-1.1.0/log4j2/cluster.xml org.apache.storm.daemon.nimbus
[storm@localhost ~]$ storm supervisor & 
[storm@localhost ~]$ Running: /usr/java/jdk1.8.0_144/bin/java -server -Ddaemon.name=supervisor -Dstorm.options= -Dstorm.home=/usr/storm/apache-storm-1.1.0 -Dstorm.log.dir=/usr/storm/apache-storm-1.1.0/logs -Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib -Dstorm.conf.file= -cp /usr/storm/apache-storm-1.1.0/lib/storm-core-1.1.0.jar:/usr/storm/apache-storm-1.1.0/lib/kryo-3.0.3.jar:/usr/storm/apache-storm-1.1.0/lib/reflectasm-1.10.1.jar:/usr/storm/apache-storm-1.1.0/lib/asm-5.0.3.jar:/usr/storm/apache-storm-1.1.0/lib/minlog-1.3.0.jar:/usr/storm/apache-storm-1.1.0/lib/objenesis-2.1.jar:/usr/storm/apache-storm-1.1.0/lib/clojure-1.7.0.jar:/usr/storm/apache-storm-1.1.0/lib/ring-cors-0.1.5.jar:/usr/storm/apache-storm-1.1.0/lib/disruptor-3.3.2.jar:/usr/storm/apache-storm-1.1.0/lib/log4j-api-2.8.jar:/usr/storm/apache-storm-1.1.0/lib/log4j-core-2.8.jar:/usr/storm/apache-storm-1.1.0/lib/log4j-slf4j-impl-2.8.jar:/usr/storm/apache-storm-1.1.0/lib/slf4j-api-1.7.21.jar:/usr/storm/apache-storm-1.1.0/lib/log4j-over-slf4j-1.6.6.jar:/usr/storm/apache-storm-1.1.0/lib/servlet-api-2.5.jar:/usr/storm/apache-storm-1.1.0/lib/storm-rename-hack-1.1.0.jar:/usr/storm/apache-storm-1.1.0/conf -Xmx256m -Dlogfile.name=supervisor.log -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -Dlog4j.configurationFile=/usr/storm/apache-storm-1.1.0/log4j2/cluster.xml org.apache.storm.daemon.supervisor.Supervisor
[storm@localhost ~]$ storm ui & 
[storm@localhost ~]$ Running: /usr/java/jdk1.8.0_144/bin/java -server -Ddaemon.name=ui -Dstorm.options= -Dstorm.home=/usr/storm/apache-storm-1.1.0 -Dstorm.log.dir=/usr/storm/apache-storm-1.1.0/logs -Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib -Dstorm.conf.file= -cp /usr/storm/apache-storm-1.1.0/lib/storm-core-1.1.0.jar:/usr/storm/apache-storm-1.1.0/lib/kryo-3.0.3.jar:/usr/storm/apache-storm-1.1.0/lib/reflectasm-1.10.1.jar:/usr/storm/apache-storm-1.1.0/lib/asm-5.0.3.jar:/usr/storm/apache-storm-1.1.0/lib/minlog-1.3.0.jar:/usr/storm/apache-storm-1.1.0/lib/objenesis-2.1.jar:/usr/storm/apache-storm-1.1.0/lib/clojure-1.7.0.jar:/usr/storm/apache-storm-1.1.0/lib/ring-cors-0.1.5.jar:/usr/storm/apache-storm-1.1.0/lib/disruptor-3.3.2.jar:/usr/storm/apache-storm-1.1.0/lib/log4j-api-2.8.jar:/usr/storm/apache-storm-1.1.0/lib/log4j-core-2.8.jar:/usr/storm/apache-storm-1.1.0/lib/log4j-slf4j-impl-2.8.jar:/usr/storm/apache-storm-1.1.0/lib/slf4j-api-1.7.21.jar:/usr/storm/apache-storm-1.1.0/lib/log4j-over-slf4j-1.6.6.jar:/usr/storm/apache-storm-1.1.0/lib/servlet-api-2.5.jar:/usr/storm/apache-storm-1.1.0/lib/storm-rename-hack-1.1.0.jar:/usr/storm/apache-storm-1.1.0:/usr/storm/apache-storm-1.1.0/conf -Xmx768m -Dlogfile.name=ui.log -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -Dlog4j.configurationFile=/usr/storm/apache-storm-1.1.0/log4j2/cluster.xml org.apache.storm.ui.core
[storm@localhost ~]$ jps
4177 nimbus
4243 Supervisor
4596 Jps
4502 core
4295 core
 
cs


5. Storm 서비스 확인 : 

http://<hostname 또는 ip주소 >:8080 으로 접속하면 아래와 같은 화면을 볼 수 있다. 

Nimbus Summary 에서 localhost 에 하나의 Nimbus가 떠 있는 것을 볼 수 있으며, Supervisor Summary에도 또 하나의 Supervisor 가 떠있는 것을 확인할 수 있다. Topology Summary 에는 현재 등록되어 있는 topology 들을 확인할 수 있다.  


6. 토폴로지 수행 (with maven) 

위에서 설치한 Apache Storm에는 기본적으로 처음 storm을 사용하는 사람들을 위해 storm-starter 라는 예제를 제공하고 있다. 

이것을 빌드하기 위해서 maven을 주로 사용하며, 손 쉽게 topology를 worker node에 배포할 수 있다. Maven은 centOS7 기준으로 다음과 같이 간단히 설치할 수 있다. 

1
2
3
4
5
6
7
8
9
[root@localhost ~]# yum -y install maven
[root@localhost ~]# mvn -version
Apache Maven 3.0.5 (Red Hat 3.0.5-17)
Maven home: /usr/share/maven
Java version: 1.8.0_144, vendor: Oracle Corporation
Java home: /usr/java/jdk1.8.0_144/jre
Default locale: ko_KR, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-514.26.2.el7.x86_64", arch: "amd64", family: "unix"
 
cs

이제 storm-starter의 경로로 이동하여, ExclamationTopology 라는 클래스로 작성된 topology를 수행하려고 한다. 
우선 maven을 이용하여storm-starter를 수행하기 위해서 필요한 라이브러리들을 다운받도록 하자. VM환경에서 수행한다면 꽤 시간이 걸릴 수도 있다. 

1
2
3
4
[storm@localhost ~]$ cd  /usr/storm/apache-storm-1.1.0/examples/storm-starter
[storm@localhost storm-starter]$ ls
README.markdown  multilang  pom.xml  src  test
[storm@localhost storm-starter]$ mvn clean install -DskipTests=true
cs


1
2
3
4
5
6
7
8
9
10
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 45:11.460s
[INFO] Finished at: Thu Aug 31 00:11:49 KST 2017
[INFO] Final Memory: 52M/171M
[INFO] ------------------------------------------------------------------------
 
 
 
cs

위와 같이 빌드가 성공적으로 완료가 되면, storm jar 를 통해서 ExclamationTopology 를 배포한다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[storm@localhost storm-starter]$ storm jar target/storm-starter*.jar org.apache.storm.starter.ExclamationTopology ExclamationTopology
Running: /usr/java/jdk1.8.0_144/bin/java -client -Ddaemon.name= -Dstorm.options= -Dstorm.home=/usr/storm/apache-storm-1.1.0 -Dstorm.log.dir=/usr/storm/apache-storm-1.1.0/logs -Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib -Dstorm.conf.file= -cp /usr/storm/apache-storm-1.1.0/lib/storm-core-1.1.0.jar:/usr/storm/apache-storm-1.1.0/lib/kryo-3.0.3.jar:/usr/storm/apache-storm-1.1.0/lib/reflectasm-1.10.1.jar:/usr/storm/apache-storm-1.1.0/lib/asm-5.0.3.jar:/usr/storm/apache-storm-1.1.0/lib/minlog-1.3.0.jar:/usr/storm/apache-storm-1.1.0/lib/objenesis-2.1.jar:/usr/storm/apache-storm-1.1.0/lib/clojure-1.7.0.jar:/usr/storm/apache-storm-1.1.0/lib/ring-cors-0.1.5.jar:/usr/storm/apache-storm-1.1.0/lib/disruptor-3.3.2.jar:/usr/storm/apache-storm-1.1.0/lib/log4j-api-2.8.jar:/usr/storm/apache-storm-1.1.0/lib/log4j-core-2.8.jar:/usr/storm/apache-storm-1.1.0/lib/log4j-slf4j-impl-2.8.jar:/usr/storm/apache-storm-1.1.0/lib/slf4j-api-1.7.21.jar:/usr/storm/apache-storm-1.1.0/lib/log4j-over-slf4j-1.6.6.jar:/usr/storm/apache-storm-1.1.0/lib/servlet-api-2.5.jar:/usr/storm/apache-storm-1.1.0/lib/storm-rename-hack-1.1.0.jar:target/storm-starter-1.1.0.jar:/usr/storm/apache-storm-1.1.0/conf:/usr/storm/apache-storm-1.1.0/bin -Dstorm.jar=target/storm-starter-1.1.0.jar -Dstorm.dependency.jars= -Dstorm.dependency.artifacts={} org.apache.storm.starter.ExclamationTopology ExclamationTopology
1217 [main] INFO  o.a.s.StormSubmitter - Generated ZooKeeper secret payload for MD5-digest: -7035538689861770541:-5742338849084452195
1511 [main] INFO  o.a.s.u.NimbusClient - Found leader nimbus : localhost:6627
1606 [main] INFO  o.a.s.s.a.AuthUtils - Got AutoCreds []
1609 [main] INFO  o.a.s.u.NimbusClient - Found leader nimbus : localhost:6627
1644 [main] INFO  o.a.s.StormSubmitter - Uploading dependencies - jars...
1666 [main] INFO  o.a.s.StormSubmitter - Uploading dependencies - artifacts...
1667 [main] INFO  o.a.s.StormSubmitter - Dependency Blob keys - jars : [] / artifacts : []
1678 [main] INFO  o.a.s.StormSubmitter - Uploading topology jar target/storm-starter-1.1.0.jar to assigned location: /usr/storm/apache-storm-1.1.0/storm-local/nimbus/inbox/stormjar-c5991a63-84b8-4856-954b-e1a32bae2be5.jar
Start uploading file 'target/storm-starter-1.1.0.jar' to '/usr/storm/apache-storm-1.1.0/storm-local/nimbus/inbox/stormjar-c5991a63-84b8-4856-954b-e1a32bae2be5.jar' (64298106 bytes)
[==================================================64298106 / 64298106
File 'target/storm-starter-1.1.0.jar' uploaded to '/usr/storm/apache-storm-1.1.0/storm-local/nimbus/inbox/stormjar-c5991a63-84b8-4856-954b-e1a32bae2be5.jar' (64298106 bytes)
2469 [main] INFO  o.a.s.StormSubmitter - Successfully uploaded topology jar to assigned location: /usr/storm/apache-storm-1.1.0/storm-local/nimbus/inbox/stormjar-c5991a63-84b8-4856-954b-e1a32bae2be5.jar
2469 [main] INFO  o.a.s.StormSubmitter - Submitting topology ExclamationTopology in distributed mode with conf {"storm.zookeeper.topology.auth.scheme":"digest","storm.zookeeper.topology.auth.payload":"-7035538689861770541:-5742338849084452195","topology.workers":3,"topology.debug":true}
3820 [main] INFO  o.a.s.StormSubmitter - Finished submitting topology: ExclamationTopology
cs


7. Topology 수행 확인 

앞서 보았던 http://<hostname 또는 ip주소 >:8080 를 통하여 수행중인 Topology를 확인할 수 있다. 



끝.

Share Link
reply
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30