2. Flume
● 데이터 수집 목적
○ 다양한 소스로부터
○ 다양한 보관소로의
○ 데이터 흐름을 처리
● Flume 이벤트
○ 헤더와 데이터(payload)로 구성
○ 에이전트를 통해 이동하는 단위
● Flume 에이전트
○ 이벤트(데이터) 흐름 제어
○ 에이전트 간 데이터 이동 가능
■ 1개 에이전트가 다수의 에이전트와 연결 가능
3. 에이전트의 기본 구성
에이전트
소스가 읽어오는 대
상
(예, TCP 데이터,
Avro 클라이언트 등)
소스
Source
채널
Channel
싱크
Sink
싱크가 출력하는 대
상
(예, HDFS, HBASE,
파일, 다른 에이전트
등)
● 소스: 지정한 소스를 통해서 이벤트를 받아 채널로 전달
● 채널: 이벤트를 임시로 보관
●
○ 메모리 채널, 파일 채널, DB 채널
싱크: 채널에서 이벤트를 읽어와 출력 대상에 씀
○ 싱크가 출력 대상에 이벤트(데이터)를 전달을 완료하
면, 채널에서 해당 이벤트를 삭제
7. 주요 Source와 Sink
소스의 종류:
● Spooling Directory Source: 디렉토리에 새롭게 추가되는 파일을 데이터로 사용
● Exec Source: 명령행을 실행하고 콘솔 출력 내용을 데이터 입력으로 사용
● Avro Source: 외부 Avro 클라이언트에서 전송하는 데이터 수신해서 입력으로 사용
● Thrift Source: 외부 Thrift 클라이언트에서 전송하는 데이터 수신해서 입력으로 사용
● JMS Source: JMS 메시지를 입력으로 사용
● Syslog Source: 시스템 로그를 입력으로 사용
● NetCat source: TCP로 라인 단위 입력 받음
싱크의 종류:
● HDFS Sink: HDFS에 데이터를 파일로 씀
● HBase Sink: HBase에 데이터를 씀
● Avro Sink: 다른 Avro 서버(Avro Source)에 이벤트를 전달함
● Thrift Sink: 다른 Thrift 서버(Thrift Source)에 이벤트를 전달함
● File Roll Sink: 로컬 파일에 데이터를 씀
● MorphlineSolrSink: 데이터를 변환해서 Solr 서버에 씀
● ElasticSearchSink: 데이터를 변환해서 ElasticSearch 클러스터에 씀
● Null Sink: 이벤트를 버림
8. 에이전트 설정: 파일 이용
# a1 에이전트의 소스, 채널, 싱크 목록
a1.sources = avrsrc
a1.channels = memch
a1.sinks = avrsink
# a1 에이전트의 소스 설정
a1.sources.avrsrc.type = avro
a1.sources.avrsrc.bind = 0.0.0.0
a1.sources.avrsrc.port = 44444
a1.sources.avrsrc.channels = memch
...
# a1 에이전트의 채널 설정
a1.channels.memch.type = memory
...
# a1 에이전트의 싱크 설정
a1.sinks.avrsink.type = avro
a1.sinks.avrsink.hostname = otherhost
a1.sinks.avrsink.port = 55555
a1.sinks.avrsink.channel = memch
...
에이전트
avrsrc
memch
avrsink
-- 에이전트 실행 시, 에이전트 이름 지정
$ flume-ng agent -n a1
-c conf
-f confg.properties
9. Interceptor
● Source로 들어온 이벤트 수정 또는 버릴 때
사용
○ Source로 들어온 이벤트는 interceptor를 거친 뒤에
채널에 전달
● Interceptor의 종류
○ Timestamp : 이벤트 헤더에 현재 시간 값 추가
○ Static Interceptor : 이벤트 헤더에 지정한 값 추가
○ Regex filtering interceptor : 정규 표현식에 일치하는
지 여부에 따라 이벤트를 버릴지 여부 결정
● 한 개 이상 interceptor 적용 가능
10. Channel Selector
● Source가 받은 이벤트를 전달할 채널을 선택
○ replicating, multiplexing(헤더 값을 기준 선택)
replicating 채널 선택
소스
모두
전달
채
널
multiplexing 채널 선택
state헤더값
이
“2”인 것
Avro
Sink
채
널
Avro
Sink
채
널
HDFS
Sink
소스
채
널
HDFS
Sink
a1.sources.s1.channels = c1 c2
# replicating이 default
a1.sources.s1.selector.type = replicating
state헤더값
이
“1”인 것
a1.sources.s1.channels = c1 c2
a1.sources.s1.selector.type = multiplexing
a1.sources.s1.selector.header = state
a1.sources.s1.selector.mapping.1 = c1
a1.sources.s1.selector.mapping.2 = c2
a1.sources.s1.selector.default = c1
11. Sink Processor
● 한 채널에 여러 Sink를 그룹으로 묶을 때 사용
종류
설명
설정 예
Default
한 채널에 한 개 Sink
Failover
우선 순위 높은 Sink에 이벤트를
쓰고, 문제 발생시 우선순위 낮은
Sink에 씀
문제 해결시, 다시 우선 순위 높
은 Sink에 쓰기 시작
a1.sinks.main.channel = c1
a2.sinks.backup.channel = c1
a1.sinkgroups.g1.sinks = main backup
a2.sinkgroups.g1.processor.type = failover
a2.sinkgroups.g1.processor.priority.main = 10
a2.sinkgroups.g1.processor.priority.backup = 5
Load
Balance
Sink를 알맞게 배분
(round_robin, random)
a1.sinkgroups.g1.sinks = s1 s2
a1.sinkgroups.g1.processor.type = load_balance
a1.sinkgroups.g1.processor.selector = random
12. 어플리케이션이 생성한 데이터를
Source에 이벤트로 전송하려면?
● Avro/Thrift 클라이언트 이용해서 직접 데이터
를 Source에 추가
○ 예, flume을 위한 Log4jAppender 사용해서 Log4j 로
그를 특정 에이전트의 Avro Source로 전송
● 파일을 읽어오는 Source 사용
○ 예, Spooling Directory Source 사용
● Flume이 제공하는 클라이언트로 파일 데이터
를 Avro Source로 전송
○ $ flume-ng avro-client -H host -p 44444 -F someFile
13. 관련된 또는 비슷한 다른 기술
●
●
●
●
●
Logstash (로그 수집)
Fluentd (로그 수집)
Kafka (메시징)
Storm (스트림 변환)
…. 너무 많음