빅데이터

데이터 수집 – flume [1/2]

CyberI 2017. 5. 12. 11:07

Apache Flume

<그림 출처 : https://flume.apache.org/FlumeUserGuide.html>

빅데이터를 시작할 때 가장 기초가 되는 데이터 수집 부분에는 여러 오픈소스들이 존재합니다. 그 중에서 대체적으로 많이 사용되는 flume에 대해서 알아보려고 합니다.




Flume을 간단하게 정의하자면 다양한 소스로부터 대량의 정보를 효율적으로 수집, 통합, 전송하는 시스템 입니다.

 

Flume은 장애 발생시 데이터의 유실 없이 전송할 수 있는 신뢰성, agent의 손쉬운 추가 및 제거를 통한 시스템의 확장성, 간결한 구조를 가져 관리가 쉬운 용이성, 새로운 기능을 쉽게 추가 가능한 기능의 확장성을 장점으로 가지고 있습니다.

사용측면의 장점은 별다른 프로그래밍 없이 환경설정 파일의 설정만으로 데이터를 file, avro등으로부터 HDFS, Hbase, Hive등 에 저장할 수 있는 다양한 source sink를 제공하여 여러 방면으로 데이터를 보다 쉽게 수집 및 저장 할 수 있고 30초마다 설정파일을 읽어 설정을 적용하는 기능(옵션)으로 프로그램의 재시작 없이 변경된 설정대로 동작하는 장점이 있습니다.

물론 정해진 source sink 이외에도 사용자가 원하는 유형은 프로그래밍을 통한 custom source/sink를 제공하여 정보 저장 및 수집 유형에 대한 유연성을 제공합니다.


Flume 구성

<그림 출처 : https://flume.apache.org/FlumeUserGuide.html>

기본적인 구성은 크게  source, channel, sink로 구성이 되어있고 이외에 부가적인 요소로 interceptor가 존재 합니다.

각 구성 요소들을 수행하는 역할을 살펴보도록 하겠습니다.

Source : 외부에서의 데이터를 수집하여 channel에 저장 수행

Channel : sourcesink의 의존성을 제거하고 장애에 대비하기 위해 데이터 임시보관는 queue 역할 수행

Sink : channel로부터 데이터를 정보를 읽어 설정파일에 지정된 형태로 데이터를 저장

Interceptor : source 에서 channel로 전달되는 데이터를 가로채 labeling, 변경 등의 작업을 수행


Flume 설정


source, channel, sink의 이름정의 부분에서는 사용자가 임의로 이름을 정하여 사용할 수 있습니다.

필요한 source, channel, sink 맞는 type에 설정 항목들의 필수 혹은 선택 설정들을 적절하게 지정해주면 됩니다.


대체로 자주 쓰이는 source, channel, sink의 종류에 대해 알아보겠습니다.

Source

- Spooling Directory Source: 디렉토리에 새롭게 추가되는 파일을 데이터로 사용

- Exec Source: 시스템 명령어를 실행하고 출력 내용을 데이터 입력으로 사용

- Avro Source: 외부 Avro 클라이언트에서 전송하는 데이터 수신해서 입력으로 사용

- Thrift Source: 외부 Thrift 클라이언트에서 전송하는 데이터 수신해서 입력으로 사용

- JMS Source: JMS 메시지를 입력으로 사용

- kafka source : kafka로부터 데이터를 가져와 입력으로 사용

- Syslog Source: 시스템 로그를 입력으로 사용

- NetCat source: TCP로 라인 단위 입력 받아 사용

Channel

- memory channel : 메모리에 데이터를 저장

- jdbc channel : 내장되어있는 Derby를 사용하여 데이터를 저장

- kafka channel : kafka cluster(topic)에 저장

- file channel : 로컬 파일에 저장

Sink

- HBase Sink: HBase에 데이터를 저장

- HDFS Sink: HDFS에 데이터를 파일로 저장

- Avro Sink: 다른 Avro 서버(Avro Source)에 이벤트를 전달

- Thrift Sink: 다른 Thrift 서버(Thrift Source)에 이벤트를 전달

- File Roll Sink: 로컬 파일에 데이터를 저장

- Hbase sink HBASE에 데이터 저장

- MorphlineSolrSink: 데이터를 Solr 서버에 저장

- ElasticSearchSink: 데이터를 ElasticSearch 클러스터에 저장

- Kafka sink : kafka 에 데이터를 저장

- Null Sink: 데이터를 파기


모두를 언급한건 아니지만 필요한 기능이 없다면 Custom source,sink,channel 등을 이용하여 프로그래밍을 통해 사용자가 직접 정의 할 수 도 있습니다.


Flume flow

Flume은 다양한 형태로 데이터의 흐름을 구성 할 수 있습니다.

<그림 출처 : https://flume.apache.org/FlumeUserGuide.html>

Multi-flow

다른 agent에게 데이터를 전달은 Avro를 이용하여 여러 단계를 거치는 형태를 구성 할 수 있습니다.


<그림 출처 : https://flume.apache.org/FlumeUserGuide.html>

Fan-in[Consolidation-flow]

여러 개의 sink를 하나에 source에서 취합하는 형태를 구성할 수 있습니다.

100개 이상의 서버로부터 대량의 데이터를 수집 할 경우 여러 단계를 구성하여 데이터를 수집하는 것이 일반적이다. 단계를 가지는 이유는 하나의 Flume Agent로 로그가 집중됨으로 인해서 서버 부하 발생 및 처리 지연을 방지하기 위하여 단계로 구성하는 것이 처리에 용이할 것입니다.


<그림 출처 : https://flume.apache.org/FlumeUserGuide.html>

Fan-out[multiplexing, duplicating]

하나의 source에 여러 개의 channel에 연결되는 구조를 사용할 시 multiplexing과 duplicate 이 두 가지의 방식이 있습니다.

Sourceselector 옵션의 설정으로 동작 합니다.


1. multiplexing 방식


데이터 전달 시 event header에 있는 값을 체크하여 해당하는 channel에 데이터를 선택적으로 분류 할 수 있습니다.

위 설정파일의 경우 event header에 값을 확인해 AB mem-channel-1으로 BC file-channel-2 CD면 양쪽 모두로 데이터를 보내도록 설정이 되어있습니다. Mapping에 미리 정의 되어있지 않은 값들이 들어온다면 default로 정해진 mem-channel-1 들어가게 됩니다.


2. duplicate 방식

Selector typereplicating으로 설정해주는 것만으로 모든 channelsource로부터 받은 데이터가 들어가도록 구성할 수 있습니다.




간단하게 flume이 무엇이고 어떤식으로 구성되어있는지 알아 보았습니다.

데이터 수집부분을 생각하고 있다면 간결한 아키텍처를 제공함으로써 다양한 구성이 가능하고 유지보수성과 확장성만으로도 충분히 매력적인 flume을 고려하는 것도 좋은 선택지 중 하나 일 것 이라고 생각합니다.