* 이 포스팅은 FLUME 을 이용해 HDFS에 저장하는 샘플까지만 다룬다.
공식홈페이지는 심플하다.
https://flume.apache.org/
/* 설치 */
최신버전인 1.8을 설치
[root@localhost flume]# wget http://archive.apache.org/dist/flume/1.8.0/apache-flume-1.8.0-bin.tar.gz --2018-04-10 10:19:39-- http://archive.apache.org/dist/flume/1.8.0/apache-flume-1.8.0-bin.tar.gz Resolving archive.apache.org... 163.172.17.199 Connecting to archive.apache.org|163.172.17.199|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 58688757 (56M) [application/x-gzip] Saving to: `apache-flume-1.8.0-bin.tar.gz' 100%[==============================================>] 58,688,757 7.03M/s in 11s 2018-04-10 10:19:51 (4.94 MB/s) - `apache-flume-1.8.0-bin.tar.gz' saved [58688757/58688757]
압축을 풀고 디렉토리를 살펴보면 ng 라는 이름이 거의 다 붙어있는데, 1.x 대를 ng 라고 부른다고 한다.
[root@localhost bin]# ls
flume-ng flume-ng.cmd flume-ng.ps1
그리고 실행을 위해서는 JAVA 1.8 이상 버전이 필수로 설치가 되어야한다.
/* 테스트 */
샘플 설정을 만들어보자. 공식 홈페이지에 나와있는 예제이다.
vi conf/gold.conf
# example.conf: A single-node Flume configuration # Name the components on this agent a1.sources = r1 a1.sinks = k1 a1.channels = c1 # Describe/configure the source a1.sources.r1.type = netcat a1.sources.r1.bind = localhost a1.sources.r1.port = 44444 # Describe the sink a1.sinks.k1.type = logger # Use a channel which buffers events in memory a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # Bind the source and sink to the channel a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1
실행
bin/flume-ng agent --conf conf --conf-file conf/gold.conf --name a1 -Dflume.root.logger=INFO,console
그리고 다른 콘솔을 열어 실행이 잘 되는지 확인 설정대로 44444 가 열려있음을 확인할수있다.
[root@localhost ~]# netstat -anp | grep 44444
tcp 0 0 ::ffff:127.0.0.1:44444 :::* LISTEN 4429/java
아래와 같이 telnet을 이용해 로컬에 있는 44444 포트로 데이터를 보내면
[root@localhost ~]# telnet localhost 44444 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Hello OK
아래와 같이 실행중인 데몬의 콘솔에 바로 찍히는것을 볼 수 있다.
2018-04-10 12:04:48,509 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sin oggerSink.process(LoggerSink.java:95)] Event: { headers:{} body: 48 65 6C 6C 6F 0D Hello. }
/* HDFS 연동 */
- 하둡의 경우는 아래 포스팅에서 구축한 하둡 클러스터를 사용하였다.
http://lynnij.tistory.com/entry/HADOOP-27-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-%EA%B5%AC%EC%B6%95
설정파일을 조금 변형하였다. source는 그대로 netcat 형태로 받고,
sinks 의 type을 hdfs로 바꾸어주었다. 혹시 flume/webdata디렉토리가 없다면 hadoop fs 명령어를 통해 만들어 놓도록하자.
a1.sources = r1 a1.sinks = k1 a1.channels = c1 # Describe/configure the source a1.sources.r1.type = netcat a1.sources.r1.bind = localhost a1.sources.r1.port = 44444 # Describe the sink a1.sinks.k1.type = hdfs a1.sinks.k1.hdfs.path = hdfs://192.168.192.10:9000/flume/webdata # Use a channel which buffers events in memory a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # Bind the source and sink to the channel a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1
실행과 테스트방법은 동일하다.
다만 이 방법을 통하면 하둡에 쌓인 데이터를 직접 확인이 가능하다.
[root@HADOOP1 bin]# ./hadoop fs -ls /flume/webdata Found 2 items -rw-r--r-- 3 root supergroup 159 2018-04-10 13:48 /flume/webdata/FlumeData.1523335682689 -rw-r--r-- 3 root supergroup 139 2018-04-10 13:49 /flume/webdata/FlumeData.1523335767751.tmp
진행하면서 이상하게 JAVA CLASSPATH 가 잘 잡히지 않아서,
java.lang.NoClassDefFoundError: org/apache/hadoop/io/SequenceFile$ 등의 예외가 났었다.
일단 하둡설치서버에 있는 jar 들을 flume의 lib 안에 넣어서 해결했지만, 근본적인 해결방법이 있을듯하다.