본문 바로가기
일하는 중에

flume-ng를 윈도에서 구동하려면

by likebnb 2013. 5. 19.

0. 들어가는 말


빅데이터(Big Data) 분야 중에 흔하게 접할 수 있는 것 하나가 많은 수의 서버에서 생산되는 로그들을 실시간으로 수집하여 분산 파일 시스템에 

저장하고, 이를 MapReduce를 이용하여 분석하는 일련의 프로세스이다. MapReduce는 어느 분야에서든 공통적으로 쓰이는 것이라 딱히 

새로울 것이 없다. 오늘 주목하여 살펴보려는 것은 로그를 수집하는 부분이다. 사실 로그 수집 및 분석에 대해선 Splunk라는 상용 솔루션이 이미 

한 자리를 차지하고 있다. 하지만 상용 솔루션이 대부분 그렇듯, 또 최신의 기술을 반영한 제품이 늘 그렇듯 고가의 가격이 부담스러운 장벽이 된다. 

아울러 솔루션의 범용성이란 말이 모든 것을 다 해줄 것처럼 보이지만 때론 각자의 특별한 필요는 채워줄 수 없는 문제가 있다. 



1. flume-ng는?


그래서 사람들은 많은 개발자들과 비지니스맨들이 오픈 소스를 찾아 헤매는 것이다. 빅데이터 환경에서 로그를 수집하여 Hadoop의 HDFS에 

모아주는 오픈 소스는 없을까? Flume이 있다. Flume은 자바 기반의 오픈 소스로 수 많은 서버들에서 생산되는 다양한 형태의 로그들을 다양한 

방법으로 수집하여 여러 가지 방법으로 저장소로 보낼 수 있는 프로그램이다. 현재 Flume은 아파지의 최상위 프로젝트로 관리되고 있으며 

안정화된 버전으로 1.3.1이 배포되고 있고 개발 중인 버전으로 1.4.0이 있다. 다음 링크를 방문하여 더 상세한 내용을 살펴 보기를 권한다.


http://flume.apache.org


처음 Flume은 Cloudera(http://www.cloudera.com) 에서 만들어서 사용하기 시작했고 이내 오픈 소스로 전향하여 아파치 재단에서 

관리하게 된 것이다. 0.9.x 버전을 Old Generation이라 부르고 1.0.x 부터는 Next Generation이라 부른다. 


참고로 flume의 사전적 의미다음 영어사전에 이렇게 소개되어 있다.

【명사】 (미)

1.(좁고 급한) 계류, 협곡.

2.(발전·관개용) 인공 수로; (목재·물고기 등을 방류하여 운반하는) 홈통식 수로, (물을 끌어대는) 용수로(用水路).

3.(유원지 등의) 워터 슈트(water chute).



2. flume-ng를 윈도에서 빌드하기


flume-ng는 자바로 개발된 프로그램이나 리눅스를 염두에 두고 개발하였기에 기본적으로 배포되는 버전엔 리눅스용 쉘스크립트만 제공된다.

소제목을 '윈도에서 빌드하기'라고 쓰긴했으나 특별하게 플랫폼 종속적인 코드는 없으므로 이 과정이 굳이 필요한 것은 아니다. 하지만 개발환경을

윈도로 고집하는 이들을 위해 윈도에서 빌드하기를 한 번 알아보기로 하자.


2.1 준비

자바 프로그램들이 대부분 그렇듯 flume-ng도 많은 수의 자바 라이브러리들을 활용하고 있다. 이런 라이브러리들의 종속관계를 해결하고

컴파일 및 배포 등을 수월하게 하기 위해 Maven을 이용한다. 그러므로 flume-ng을 빌드를 위해 준비해야 할 것은 다음의 세 가지이다.


가. Java Development Kit

http://java.sun.com에서 최신 버전의 JDK를 다운 받아 설치한다. 참고로 flume-ng의 SINK 중에 HDFS를 사용하는 것이 목적이라면

JDK는 최소 1.6 버전 이상으로 할 것을 권한다. 


나. Maven 

http://maven.apache.org에서 최신 버전을 받아서 압축을 풀고 경로 및 몇 가지 환경변수를 지정해주면 된다.


다. flume-ng Source 

http://flume.apache.org의 Download에서 배포하는 최신 소스를 다운받아서 압축을 해제하면 된다.




2.2 환경 변수 지정

JDK가 설치된(압축 해제된) 경로와 Maven이 설치된 경로를 각각 JAVA_HOME과 M2_HOME으로 설정한다. 

그리고 Maven의 바이너리 경로와 Maven 실행옵션을 각각 M2와 MAVEN_OPTS로 설정하고 마지막으로  PATH를 추가해준다.


JAVA_HOME=c:\java\jdk_1.7.0_21

M2_HOME=c:\java\apache-maven-3.0.5

M2=%M2_HOME%\bin

MAVEN_OPTS=-XX:MaxPermSize=1024M

PATH=%PATH%;%M2%;%JAVA_HOME%\bin



2.3 컴파일 및 설치

다운 받은 flume-ng의 소스 경로로 이동한 다음 Maven의 컴파일 명령과 설치 명령을 차례로 실행한다. 특히 실행 명령의 경우는 테스트를

하지 않고 바로 설치만 하도록 옵션 -DskipTests를 추가하도록 한다.


C:/> cd c:\java\apache-flume-1.3.1-src\

C:/> mvn compile

C:/> mvn install -DskipTests



2.5 배포본 확인

컴파일과 설치가 정상적으로 끝나면 flume-ng-dist 밑의 target 디렉토리에서 *.tar.gz와 같이 압축된 형태의 바이너리 파일을 찾아 볼 수 있다.

이를 원하는 경로로 옮겨와서 압축을 해제하면 lib 디렉토리에서 컴파일되어 묶인 *.jar 파일들을 볼 수 있다.




3. flume-ng를 윈도에서 실행하기 위해 .bat 작성하기


이제 *.jar 파일을 실행하면 된다. flume-ng의 공식 홈페이지에서 배포하는 버전은 리눅스를 기준으로 하고 있기 때문에 윈도용 스크립트는

제공하지 않는다. 그러므로 리눅스용 쉘스크립트를 윈도용으로 마이그레이션 할 필요가 있다. 이 때 주의 할 것은 윈도의 쉘스크립트에서는 

하나의 명령을 여러 줄로 나눠 쓸 때 ^(carrot) 문자를 사용한다는 점이다. 물론 선언한 변수를 사용하는 방법도 특이하다. 변수명 앞뒤에

%를 붙여서 사용한다. 그리고 자바 VM을 실행할 때 다음과 같은 순서를 지켜야 함을 잊지 않도록 하자.


 java <java option> <system properties> <class path> <class> <arguments>


이와 같은 순서를 지켜서 flume-ng를 구동하는 윈도용 쉘스크립트를 다음과 같이 작성할 수 있다.


set FLUME_HOME=C:\java\flume-ng
set JAVA="C:\java\jdk1.6.0_43\bin\java.exe"
set JAVA_OPTS=-Xmx256m
set LOG4J_OPTS="-Dlog4j.configuration=file:///%FLUME_HOME%\conf\log4j.properties"
set FLUME_CLASS=org.apache.flume.node.Application
set CONF=%FLUME_HOME%\conf\spoolhdfs.conf
set AGENT=agent1

%JAVA% %JAVA_OPTS% %LOG4J_OPTS% ^  
       -Dflume.monitoring.type=http -Dflume.monitoring.port=34545 ^  
       -cp "%FLUME_HOME%\lib\*" ^  

       %FLUME_CLASS% -f %CONF% -n %AGENT% 


배치 파일명은 flume-agent.bat 정도가 적당하겠다. 이제 배치 파일을 실행하면 커맨드 창에 실행 로그들이 올라가는 것을 볼 수 있을 것이다.

브라우저를 열어서 주소줄에 다음과 같이 입력해보도록 하자, 그러면 현재 flume agent의 상태 정보를 JSON 형태로 확인할 수 있다.


http://localhost:34545/metrics


flume-ng를 구성하고 있는 라이브러리들 중에 jetty라는 게 있다. 위 실행 옵션 중에 flume.monitoring.type=http를 담당하는 것으로

이를 잘 활용하면 run time으로 flume agent의 configuration을 배포할 수 있을 것으로 기대한다.



4. flume-ng 배치 파일을 서비스로 등록하기


자, 이제 마지막 단계 하나가 남았다. 앞에서 작성한 것은 쉘스크립트이다. 이런 배치 파일들은 누군가 윈도에 로그인하여 실행해주어야 한다.

데스크탑이라면 모를까 서버에서는 이런 실행 방법은 적합하지 않다. 서버에서는 우리가 흔히 말하는 데몬 또는 서비스 형태로 프로그램을

실행해줘야 한다. 그래서 로그인하지 않고도 서버가 부팅될 때 자동으로 실행될 수 있어야 한다.


자바로 만든 프로그램을 실행하는 윈도의 쉘스크립트를 윈도 서비스로 등록하는 방법이 필요한 것이다. 아파치에서 이런 경우에 사용할 수 있는 

프로그램을 제공하고 있다. http://commons.apache.org/proper/commons-daemon/ 에서 자세한 내용은 확인하도록 하자.


또 한 가지 방법이 있는데 ezSVC(http://isulnara.com)라는 프로그램이 있다. 이 프로그램을 이용하여 flume-agent.bat 파일을 

서비스로 등록하여 자동 실행할 수 있다. GUI를 통해서 설정하지 않고 직접 커맨드 라인에서 바로 설정할 수도 있다. ezSVC.ini를 통해 

미리 정의한 설정파일을 배포할 수도 있다. 


두 가지 방법 중 각자의 상황에 적합한 방법을 선택하여 손쉽게 서비스로 등록할 수 있다. 물론 여건이 허락한다면 직접 서비스로 개발하여

사용하여도 좋다.