대메뉴 바로가기 본문 바로가기

데이터 기술 자료

데이터 기술 자료 상세보기
제목 아파치 스톰을 이용한 실시간 스트리밍 데이터 처리 실습
등록일 조회수 6976
첨부파일  

실시간 스트리밍 데이터 처리의 이해

아파치 스톰을 이용한 실시간 스트리밍 데이터 처리 실습



클러스터를 이용하여 서버의 수를 자유자재로 늘리면서 데이터를 분석할 수 있게 됐다. 이로써 많은 양의 데이터가 들어오더라도, 실시간으로 쌓이는 로그의 양이 많더라도, 일정 수준 이상의 속도로 데이터를 처리할 수 있다. 이는 급격히 변하는 비즈니스 환경에서 무의미해 보이는 데이터로부터 의사 결정에 유용한 정보를 찾아낼 수 있는 기반이 됐다. 이번 글에서는 실시간 데이터를 처리하는 툴 중에 하나로 안정적으로 사용되고 있는 아파치 스톰을 설치해보고, 실행해 볼 것이다. 스톰을 로컬 또는 싱글 클러스터로만 실행을 할 수만 있다면, 실제 서버를 이용하던지, VM을 이용하여 다수의 서버를 운용하는 것은 쉽다. 이는 스톰 플레임웍이 이 모든 복잡하고, 지루한 작업을 맡아주기 때문이다.



아파치 스톰을 위한 설치

아파치 스톰을 실행하기 위해서는 다음과 같은 구성 요소가 필요하다. 본 예제의 경우 서버 환경에서 일반적으로 쓰이는 리눅스 OS, 그 중에서도 CentOS를 기준으로 설명해보겠다.



JDK 설치

CentOS의 경우 다음과 같이 설치 가능하다.



# yum install java-1.7.0-openjdk-devel.x86_64





<그림 1> CentOS 설치 화면

Zookeeper 설치 및 실행

1. Zookeeper 실행 파일을 다운받아 압축을 푼다.



# wget http://mirror.apache-kr.org/zookeeper/stable/zookeeper-3.4.6.tar.gz # tar xvzf zookeeper-3.4.6.tar.gz



2. 환경 변수 설정 파일을 생성한다. 이때, 샘플 파일을 편집하여 사용할 수 있다.



# cd zookeeper-3.4.6/conf # cp zoo_sample.cfg zoo.cfg # vi zoo.cfg



아래의 그림은 샘플 파일 내용이다. 주석과 함께 설정할 수 있는 속성값을 볼 수 있다.





<그림 2> zoo.cfg 파일

3. Zookeeper 실행 스크립트를 이용하여 Zookeeper를 실행한다.



# cd ../bin # .zkServer.sh start



Zookeeper를 실행시 다음과 그림과 같다.





<그림 3> Zookeeper 실행

ZeroMQ 설치하기

1. ZeroMQ를 컴파일하기 위한 기본 라이브러리를 설치한다. CentOS 같은 경우는 다음과 같이 yum을 이용하여 간단히 설치 가능하다.



# yum install gcc gcc-c++ libuuid-devel





<그림 4> ZeroMQ 실행을 위한 라이브러리 설치

2. ZeroMQ를 다운받아 압축을 푼다.



# wget http://download.zeromq.org/zeromq-4.0.5.tar.gz # tar xvzf zeromq-4.0.5.tar.gz



3. ZeroMQ를 컴파일 및 설치한다.



# cd zeromq-4.0.5.tar.gz # ./configure # make # make install



다음은 ZeroMQ 설치 후의 스크린샷이다.





<그림 5> ZeroMQ 설치

Java ZeroMQ(JZMQ)

1. Git에서 소스 코드를 다운 받아 사용할 것이기 때문에 먼저 git(버전 컨트롤 툴)을 설치한다.



# yum install git libtool



2. Git에서 소스 파일 다운로드, 컴파일 및 설치한다.



# git clone https://github.com/nathanmarz/jzmq.git # cd jzmq # ./autogen.sh # ./configure # make # make install



3. 설치 후 zmq.jar이 다음 경로에 생성되었음을 확인할 수 있다.



# cd /usr/local/share/java # ls





<그림 6> zmq.jar 파일 생성

아파치 스톰 설치

이제 스톰을 실행하기 위한 모든 준비가 끝났다. 이제 본격적으로 스톰을 설치해서 사용해 볼 수 있다.



# wget http://mirror.apache-kr.org/storm/apache-storm-0.9.4/apache-storm-0.9.4.tar.gz # tar xvzf apache-storm-0.9.4 # cd apache-storm-0.9.4



스톰의 설정 파일을 변경하여 스톰을 구성할 수 있다.



# cd conf # vi storm.yaml



설정 파일은 다음과 같다.





<그림 7> storm.yaml 파일 예시

아파치 스톰 실행

스톰을 이용해 분석을 하기 위해서는 다음의 두가지 구성 요소를 실행 시켜야 한다. 1. Nimbus 주요 설를 각 클러스터 노드에 배포하는 역할을 한다. 그렇기 때문에 하나의 Nimbus만을 가진다. 다음의 명령어로 실행시킨다.



# storm nimbus



2. Supervisor 실제 데이터를 처리하는 워커(Worker)이다. Nimbus로 부터 배정된 작업을 실행하는 역할을 한다. 분산 처리를 하기 위해 여러 서버에 설치된다. 그렇기 때문에 모든 데이터 처리를 하는 클러스터 서버에서 실행시킨다. 다음의 명령어로 실행시킨다.



# storm supervisor



스톰 토폴로지 실행하기

스톰에서 볼트(Bolt)와 스파우트(Spout)를 가지고 프로세싱 네트워크를 구축한 것을 토폴로지(Topology)라고 한다. 우선 스톰을 실행할 수 있는 환경을 구축하였기 때문에 토폴로지를 바로 실행 할 수 있다. 먼저 Git을 통해 다운받은 Storm 소스 폴더의 예제를 살펴보자.



/storm/examples/storm-starter/src/jvm/storm/starter/ExclamationTopology.java



해당 토폴로지에서는 다음과 같이 볼트(Bolt)를 정의하고 있다.



public static class ExclamationBolt extends BaseRichBolt { OutputCollector _collector; @Override public void prepare(Map conf, TopologyContext context, OutputCollector collector) { _collector = collector; } @Override public void execute(Tuple tuple) { _collector.emit(tuple, new Values(tuple.getString(0) + "!!!")); _collector.ack(tuple); } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("word")); } }



그리고 다음의 Main 함수를 이용하여 토폴로지를 실행하는 것이다.



public static void main(String[] args) throws Exception { TopologyBuilder builder = new TopologyBuilder(); builder.setSpout("word", new TestWordSpout(), 10); builder.setBolt("exclaim1", new ExclamationBolt(), 3).shuffleGrouping("word"); builder.setBolt("exclaim2", new ExclamationBolt(), 2).shuffleGrouping("exclaim1"); Config conf = new Config(); conf.setDebug(true); if (args != null && args.length > 0) { conf.setNumWorkers(3); StormSubmitter.submitTopologyWithProgressBar(args[0], conf, builder.createTopology()); } else { LocalCluster cluster = new LocalCluster(); cluster.submitTopology("test", conf, builder.createTopology()); Utils.sleep(10000); cluster.killTopology("test"); cluster.shutdown(); }



위의 예제 코드의 경우 ‘LocalCluster’를 활용하는 예제이다. 실제 클러스터를 이용할 경우에는 다음과 같이 ‘StormSubmitter’ 클래스를 이용할 수 있다.



Config conf = new Config(); conf.setNumWorkers(20); conf.setMaxSpoutPending(5000); StormSubmitter.submitTopology("mytopology", conf, topology);



코드에서 ‘NumWorkers’와 ‘MaxSpoutPending’에 대해서 간단히 설명하자면, ‘NumWorkers’의 경우 ‘Config.TOPOLOGY_WORKERS’ 값을 의미하는데 클러스터 전체에서 실행될 자바 프로세스의 개수를 말한다. 즉, Worker Process의 수를 설정하는 것이다. 그리고 ‘MaxSpoutPending’의 경우는 하나의 스파우트(Spout)의 큐에서 기다리는 튜플(Tuple)의 개수를 제한하는 것이다. 스파우트 큐가 무한히 증가하는 것을 막기 위해서 해당값을 설정해야 한다.



토폴로지 배포

위와 같이 토폴로지 클래스를 작성한 후 다음의 명령어를 통해 토폴로지를 각 클러스터에 배포할 수 있다. 이로써 실제로 각 클러스터에서 설정에 따라 스파우트와 볼트를 실행하게 된다. 이 때, 앞서 설명했듯이 미리 설정한 값에 의해 스파우트와 볼트를 적절히 분배하게 된다.



# storm {jar} {jar 파일명} { 토폴로지 클래스명} { 토폴로지 이름}



토폴로지 정지

토폴로지를 정지 시켜 보자. 토폴로지의 정지는 다음의 명령을 사용하면 된다.



# storm deactivate { 토폴로지명}



토폴로지 재배포

Topology를 재배포 하려면 ‘storm kill’ 명령으로 해당 토폴로지를 삭제한 후에, 다시 배포 해야 한다.



# storm kill { 토폴로지명}



토폴로지 모니터링

클러스터 환경을 이용할 때 가장 이슈가 되는 부분이 바로 클러스터가 현재 어떻게 운영되고 있는지, 각각의 서버는 문제없이 돌아가고 있는지 모니터링하는 것이다. 스톰은 기본적으로 클러스터 환경에서의 배포와 운영을 담당하고 있기 때문에 모니터링 방안 또한 제공하고 있다. 스톰 모니터링은 ‘Storm-UI’를 이용한다. 스톰 설치 폴더에서 다음의 명령을 실행하게 되면 스톰의 UI 웹서버를 실행 시킬 수 있다.



# storm ui



마치는 글

스톰을 설치하고 운영하기 위해서 스톰 이외에 여러 컴포넌트들을 설치하고 이용하였다. 먼저 주키퍼(Zookeeper)라는??스템을 이용한다. 주키퍼는 각각의 클러스터의 장애 상황을 모니터링하고 복구하는 중요한 역할을 하고 있다. 그리고 ZeroMQ의 경우 각 노드의 워커 간의 통신에 쓰이기 때문에 대규모 분산 시스템에서 메시징을 담당하게 된다. 스톰을 활용하는 이유는 분명하다. 개발자는 볼트/스파우트로 구성된 토폴로지를 설계하는데 집중해야 한다. 그리고 스톰은 해당 분석 로직을 클러스터에 분산시켜 동작하게 해준다. 어떤 클러스터에서 어떤 구성 요소가 실행될지는 설정에 의해 스톰이 관리해주기 때문에 개발자는 클러스터 운영에 대한 부담이 줄어든다.



출처 : 마이크로소프트웨어 5월호

제공 : 데이터전문가 지식포털 DBguide.net