본문 바로가기
빅데이터/flume

[flume] 플룸 구조, 특징

by hs_seo 2019. 7. 26.

로그 수집 단계에서 이용하는 아파치 플룸(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 프로세스
    • 소스, 채널, 싱크로 구성
  • 외부 소스에서 전달된 이벤트를 다른 목적지로 이동

flume agent

플룸 에이전트 구성요소

  • 소스
    • 웹 서버 같은 외부 소스에 의해 전달되는 이벤트를 수집
    • 외부 소스는 플룸이 인식하는 형태로 이벤트를 전달
      • 예를 들어 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

  • 에이전트의 싱크와 소스를 연결

flow1

Consolidation

  • 여러 소스에서 전달된 이벤트를 각 에이전트가 받아서 하나의 에이전트가 통합하여 저장

flow2

Multiplexing the flow

  • 하나의 에이전트에서 여러개의 채널로 이벤트를 전달

flow3

예제

플룸 다운로드

먼저 플룸 공식 홈페이지에서 플룸을 다운로드 합니다. 저는 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

참고

반응형