Flume?

간단하게 설명 드리자면 Flume은 로그 수집기입니다.
수많은 서버에 분산되어 있는 많은 양의 로그 데이터를 Flume을 통해서 HDFS(hadoop distributed file system)으로 저장할수 있도록 해줍니다.
– Flume-based architecture.

flume-ng

Flume은 크게 Source, Channel, Sink 모듈로 구성되어 있습니다.

– Source

데이터를 수집하는 Logical node를 말합니다.
log data, stream, socket, database, avro, irc, file 등등의 데이터

– Channel

source로 부터 받은 데이터를 sink(target)으로 넘기기전에 데이터를 쌓아두는 곳입니다.
간단하게 말하자면 트랜잭션의 보장을 위한 저장 공간입니다.

– Sink

데이터를 보내는 것을 말합니다.
예를들면 log data, stream, socket, database, avro, irc, file 등등을 HDFS로 저장

본 글은 CentOS 6.4 (x86_64)에서 테스트 되었으며 Hadoop이 설치 되어있다는 가정하에 진행하였습니다.
Hadoop을 설치하지 않으신 분들은 Haoop 2.2.0 설치 글을 참고하셔서 미리 설치 하고 Flume을 설치를 해주셨으면 합니다.
1. Maven 설치 및 설정
Maven의 최신 버전을 받습니다.

http://maven.apache.org/download.cgi

[[email protected] ~]# su – hadoop
[[email protected] ~]$ wget http://mirror.apache-kr.org/maven/maven-3/3.1.1/binaries/apache-maven-3.1.1-bin.tar.gz
[[email protected] ~]$ tar xzvf apache-maven-3.1.1-bin.tar.gz

– Maven 설정

[[email protected] ~]$ nano ~/.bash_profile

# Maven
export M2_HOME=$HOME/apache-maven-3.1.1
export M2=$M2_HOME/bin
export MAVEN_OPTS=”-Xms512m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m”
PATH=$PATH:$M2

 
– PATH 적용

[[email protected] ~]$ source ~/.bash_profile

2. Flume 소스 빌드 및 설정
apache git 서버를 통해 개발자 버전을 받습니다.

[[email protected] ~]$ git clone https://git-wip-us.apache.org/repos/asf/flume.git flume-dev
[[email protected] ~]$ cd flume-dev

– Build

[[email protected] flume-dev]$ mvn install -DskipTests
[[email protected] flume-dev]$ cp flume-ng-dist/target/apache-flume-1.5.0-SNAPSHOT-bin.tar.gz $HOME
[[email protected] flume-dev]$ cd ~
[[email protected] ~]$ tar xzvf apache-flume-1.5.0-SNAPSHOT-bin.tar.gz
[[email protected] ~]$ mv apache-flume-1.5.0-SNAPSHOT-bin/ flume

– Flume PATH 설정

[[email protected] ~]$ nano ~/.bash_profile

# Flume
export FLUME_HOME=$HOME/flume
export PATH=$PATH:$FLUME_HOME/bin

 
– Flume PATH 적용

[[email protected] ~]$ source ~/.bash_profile

– Flume 설정

[[email protected] ~]$ cp $FLUME_HOME/conf/flume-env.sh.template $FLUME_HOME/conf/flume-env.sh
[[email protected] ~]$ echo ‘JAVA_HOME=”$HOME/jdk”‘ >> $FLUME_HOME/conf/flume-env.sh
[[email protected] ~]$ chmod +x $FLUME_HOME/conf/flume-env.sh

– 웹서버 로그 저장 테스트용 conf 생성
본인은 Nginx 웹서버 로그를 JSON 형태로 가공된 것을 tail 명령어를 이용해서 실시간으로 쌓인 데이터를 Flume을 통해 HDFS로 저장 가능 하도록 설정파일을 만들었습니다. 더 자세한 옵션들은 http://flume.apache.org/FlumeUserGuide.html를 참고 하세요.

[[email protected] ~]$ nano $FLUME_HOME/conf/yongbok.conf

YongbokAgent.sources = Yongbok
YongbokAgent.channels = MemoryChannel
YongbokAgent.sinks = HDFS
# For each one of the sources, the type is defined
YongbokAgent.sources.Yongbok.type = exec
YongbokAgent.sources.Yongbok.command = tail -F /storage/logs/mirror-access.json
# The channel can be defined as follows.
YongbokAgent.sources.Yongbok.channels = MemoryChannel
# Each sink’s type must be defined
YongbokAgent.sinks.HDFS.type = hdfs
# example : hdfs://localhost:port/path/to/directory or /logs
YongbokAgent.sinks.HDFS.hdfs.path = /logs
#YongbokAgent.sinks.HDFS.hdfs.writeFormat = Text
YongbokAgent.sinks.HDFS.hdfs.batchSize = 1000
YongbokAgent.sinks.HDFS.hdfs.rollSize = 0
YongbokAgent.sinks.HDFS.hdfs.rollCount = 10000
#Specify the channel the sink should use
YongbokAgent.sinks.HDFS.channel = MemoryChannel
# Each channel’s type is defined.
YongbokAgent.channels.MemoryChannel.type = memory
# Other config values specific to each type of channel(sink or source)
# can be defined as well
# In this case, it specifies the capacity of the memory channel
YongbokAgent.channels.MemoryChannel.capacity = 100000
YongbokAgent.channels.MemoryChannel.transactionCapacity = 10000

3. Hadoop 실행
하둡을 실행하지 않으면 HDFS에 로그가 저장이 안됩니다. 그래서 띄웁니다. ㅋㅋ

[[email protected] ~]$ start-all.sh

4. Flume 실행

[[email protected] ~]$ flume-ng agent –conf $FLUME_HOME/conf -f $FLUME_HOME/conf/yongbok.conf -Dflume.root.logger=DEBUG,console -n YongbokAgent

5. 로그 저장 확인

HDFS의 /logs 디렉토리에 로그가 잘 쌓여 있나 확인 합니다.

[[email protected] ~]$ hadoop fs -ls -h /logs

hadoop-fs-ls-h

 

HDFS administration 페이지에서 확인도 가능합니다.

hdfs-admin

Thanks 😀

참고