로그 수집 단계에서 이용하는 아파치 플룸(Flume)에 대해서 알아보겠습니다.
아파치 플룸(Flume)
- 클라우데라에서 개발하여 공개한 데이터 수집을 위한 오픈 소스
- 대량의 로그 데이터를 여러 소스에서 수집하여 저장하기 위한 목적
- 확장 가능하고, 신뢰성 있음.
- 현재는 아파치 탑레벨 오픈 소스
- 플룸 1.1.0 부터 구조가 변경되어 Flume-NG로 불려짐. 이전 버전은 Flume-OG
- 2019.07 현재 1.9.0 버전이 최신
- 아파치 플름 홈페이지바로가기
구조
주요 용어
이벤트
- 플룸에서 전달하는 데이터 단위
- 헤더와 바디로 구성
- byte payload and an optional set of string attributes
- 헤더: set of string attributes
- 바디: byte payload
이벤트 예시
2019-07-18 05:19:41,401 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: { headers:{} body: 31 32 33 31 32 33 0D 123123. }
플룸 에이전트
- 플룸 에이전트(Agent)는 JVM 프로세스
- 소스, 채널, 싱크로 구성
- 외부 소스에서 전달된 이벤트를 다른 목적지로 이동
플룸 에이전트 구성요소
- 소스
- 웹 서버 같은 외부 소스에 의해 전달되는 이벤트를 수집
- 외부 소스는 플룸이 인식하는 형태로 이벤트를 전달
- 예를 들어 Avro 소스는 Avro 싱크나 Avro 클라이언트에서 보내는 이벤트를 수신
- Thrift 소스는 Thrift 싱크나 Thrift 클라이언트에서 보내는 이벤트를 수신
- 종류
- Avro Source
- Thrift Source
- Exec Source
- JMS Source
- Spooling Directory Source
- Taildir Source
- Twitter 1% firehose Source (experimental)
- Kafka Source
- NetCat TCP Source
- NetCat UDP Source
- Sequence Generator Source
- Syslog Sources
- HTTP Source
- Stress Source
- Legacy Sources
- Custom Source
- Scribe Source
- 채널
- 소스가 이벤트를 수신하면 채널에 저장
- 채널은 싱크가 이벤트를 다른 목적지로 전달할 때까지 파일이나 메모리 등에 이벤트를 보관
- 종류
- Memory Channel
- JDBC Channel
- Kafka Channel
- File Channel
- Spillable Memory Channel
- Pseudo Transaction Channel
- Custom Channel
- 싱크
- 채널에서 이벤트를 제거하고 HDFS 같은 외부 저장소에 저장하거나, 다음 플룸 에이전트로 소스를 전달
- 소스와 싱크는 비동기적으로 진행
- 종류
- HDFS Sink
- Hive Sink
- Logger Sink
- Avro Sink
- Thrift Sink
- IRC Sink
- File Roll Sink
- Null Sink
- HBaseSinks
- MorphlineSolrSink
- ElasticSearchSink
- Kite Dataset Sink
- Kafka Sink
- HTTP Sink
- Custom Sink
- 채널 셀렉터(Channel Selector)
- 하나의 소스에 다수의 채널이 연결되었을 때 이벤트를 전달하는 기준
- 기본은 모든 채널에 동일한 이벤트를 전달
- 싱크 프로세서(Sink Processors)
- 채널에 연결된 싱크를 그룹으로 묶어서 사용
- 기본은 한 개의 싱크를 사용
- Failover 모드시 우선순위에 따라 순위가 높은 모드부터 사용하다가 오류가 발생하면 다음 순위의 싱크를 사용
- 인터셉터(Interceptor)
- 소스에 들어온 이벤트를 수정하거나, 수정할 때 사용
특징
- 다양한 연결 모드
- 소스와 싱크를 연결하여 최종 목적지에 이벤트를 전달 할 때까지 유연한 구성이 가능
- 안정성
- 이벤트가 다음 에이전트나, 보관소에 저장된 것을 보장하고 채널의 데이터를 삭제하여 데이터 전송의 안정성 확보
- 로컬 파일에 데이터를 저장하여 오류 발생시 데이터 복구 가능
- 메모리 저장시에는 처리 불가
연결 모드
multi-agetn flow
- 에이전트의 싱크와 소스를 연결
Consolidation
- 여러 소스에서 전달된 이벤트를 각 에이전트가 받아서 하나의 에이전트가 통합하여 저장
Multiplexing the flow
- 하나의 에이전트에서 여러개의 채널로 이벤트를 전달
예제
플룸 다운로드
먼저 플룸 공식 홈페이지에서 플룸을 다운로드 합니다. 저는 1.9.0 버전 바이너리 파일을 다운로드 하고 로컬에 압축을 해제하였습니다.
$ ls -alh
total 168
drwxr-xr-x 2 hadoop hadoop 59 Jul 18 02:06 bin
-rw-rw-r-- 1 hadoop hadoop 85602 Nov 29 2018 CHANGELOG
drwxr-xr-x 2 hadoop hadoop 142 Jul 18 04:48 conf
-rw-r--r-- 1 hadoop hadoop 5681 Nov 16 2017 DEVNOTES
-rw-r--r-- 1 hadoop hadoop 2873 Nov 16 2017 doap_Flume.rdf
drwxrwxr-x 12 hadoop hadoop 4096 Dec 17 2018 docs
drwxrwxr-x 2 hadoop hadoop 8192 Jul 18 02:06 lib
-rw-rw-r-- 1 hadoop hadoop 43405 Dec 10 2018 LICENSE
-rw-r--r-- 1 hadoop hadoop 249 Nov 28 2018 NOTICE
-rw-r--r-- 1 hadoop hadoop 2483 Nov 16 2017 README.md
-rw-rw-r-- 1 hadoop hadoop 1958 Dec 10 2018 RELEASE-NOTES
drwxrwxr-x 2 hadoop hadoop 67 Jul 18 02:06 tools
telnet 테스트
텔넷(telnet)을 이용하여 로그를 수집하는 테스트 예제입니다. 다음을 example.conf 파일로 저장합니다. conf/example.conf로 저장하였습니다.
# a1 에이전트 선언. 소스:r1, 싱크:k1, 채널:c1
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# 소스 설정. 44444 포트에 netcat 으로 읽음
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# 싱크 설정. 로그를 남기는 타입. 디버그용
a1.sinks.k1.type = logger
# 채널 설정. 메모리 타입
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 에이전트의 소스, 채널, 싱크를 연결
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
다음과 같이 실행합니다.
$ ./bin/flume-ng agent --conf conf --conf-file ./conf/example.conf --name a1 -Dflume.root.logger=INFO,console
그리고 텔넷으로 플룸 에이전트에 연결하고, 데이터를 전달하면 로그에 송신한 데이터가 표시되는 것을 확인할 수 있습니다. 싱크를 logger 로 설정했기 때문에 로그에 데이터가 표시되는데 이를 다른 타입으로 변경하면, HDFS 저장이나 로컬파일로 저장할 수 있습니다.
$ telnet localhost 44444
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
a
OK
참고
- 플룸 1.9.0 사용자 가이드 바로가기
반응형
'빅데이터 > flume' 카테고리의 다른 글
[flume] HTTP로 플룸 모니터링 설정하는 방법 (0) | 2020.06.03 |
---|---|
[flume] ChannelFullException 오류 확인 (0) | 2020.06.02 |