본문 바로가기
BIG-DATA/FLUME

[FLUME] 무작정 시작하기 (2) - Channel & Sink 의 분산처리

by 허도치 2019. 12. 2.

2019/11/29 - [BIG-DATA/FLUME] - [FLUME] 무작정 시작하기 (1) - 설치 및 실행

 

 

  지난 포스트에서 Flume을 설치하고 간단하게 실행까지 해보았다. 이번 포스트에서는 2개의 Channel과 각 Channel당 3개의 Sink를 사용해서 Telnet으로 메시지를 전송했을 때 어떻게 분산처리가 되는지 확인해보도록 하겠다.

 

 

 

1. Flume의 분산처리 흐름.

   - Source는 Application으로부터 데이터를 수집.

   - 수집한 데이터를 모든 Channel에 동일하게 저장.

   - 각 Channel은 저장된 데이터를 여러 Sink에 쪼개어 보냄.

   - Sink는 받은 데이터를 다른 Application에 데이터를 보내고 다음 작업을 기다림.

 

 

2. Flume 설정 및 실행.

   - 작업폴더: C:\work\apache-flume-1.9.0-bin

 

   2-1. [ ./conf/agent_dochi.conf ] 작성.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# agent_dochi.conf
 
# Component 이름 지정
agent_dochi.sources = telnet_src
agent_dochi.channels = mem_chnl file_chnl
agent_dochi.sinks = mem_sink_1 mem_sink_2 mem_sink_3 file_sink_1 file_sink_2 file_sink_3
 
# Netcat Source 설정
agent_dochi.sources.telnet_src.channels = mem_chnl file_chnl
agent_dochi.sources.telnet_src.type = netcat
agent_dochi.sources.telnet_src.bind = localhost
agent_dochi.sources.telnet_src.port = 44444
 
# Memory Channel 설정
agent_dochi.channels.mem_chnl.type = memory
agent_dochi.channels.mem_chnl.capacity = 1000
agent_dochi.channels.mem_chnl.transactionCapacity = 100
 
# File Channel 설정
agent_dochi.channels.file_chnl.type = file
agent_dochi.channels.file_chnl.checkpointDir = C:/work/apache-flume-1.9.0-bin/data/checkpoint
agent_dochi.channels.file_chnl.dataDirs = C:/work/apache-flume-1.9.0-bin/data/data
agent_dochi.channels.file_chnl.checkpointInterval = 30000
agent_dochi.channels.file_chnl.capacity = 1000
agent_dochi.channels.file_chnl.transactionCapacity = 100
 
 
# Sink 설정 ( Memory Channel 사용 )
agent_dochi.sinks.mem_sink_1.type = file_roll
agent_dochi.sinks.mem_sink_1.channel = mem_chnl
agent_dochi.sinks.mem_sink_1.sink.rollInterval = 0
agent_dochi.sinks.mem_sink_1.sink.directory = C:/work/apache-flume-1.9.0-bin/logs
agent_dochi.sinks.mem_sink_1.sink.pathManager.prefix = mem_to_sink1_
agent_dochi.sinks.mem_sink_1.sink.pathManager.extension = log
 
agent_dochi.sinks.mem_sink_2.type = file_roll
agent_dochi.sinks.mem_sink_2.channel = mem_chnl
agent_dochi.sinks.mem_sink_2.sink.rollInterval = 0
agent_dochi.sinks.mem_sink_2.sink.directory = C:/work/apache-flume-1.9.0-bin/logs
agent_dochi.sinks.mem_sink_2.sink.pathManager.prefix = mem_to_sink2_
agent_dochi.sinks.mem_sink_2.sink.pathManager.extension = log
 
agent_dochi.sinks.mem_sink_3.type = file_roll
agent_dochi.sinks.mem_sink_3.channel = mem_chnl
agent_dochi.sinks.mem_sink_3.sink.rollInterval = 0
agent_dochi.sinks.mem_sink_3.sink.directory = C:/work/apache-flume-1.9.0-bin/logs
agent_dochi.sinks.mem_sink_3.sink.pathManager.prefix = mem_to_sink3_
agent_dochi.sinks.mem_sink_3.sink.pathManager.extension = log
 
 
# Sink 설정 ( Memory Channel 사용 )
agent_dochi.sinks.file_sink_1.type = file_roll
agent_dochi.sinks.file_sink_1.channel = file_chnl
agent_dochi.sinks.file_sink_1.sink.rollInterval = 0
agent_dochi.sinks.file_sink_1.sink.directory = C:/work/apache-flume-1.9.0-bin/logs
agent_dochi.sinks.file_sink_1.sink.pathManager.prefix = file_to_sink1_
agent_dochi.sinks.file_sink_1.sink.pathManager.extension = log
 
agent_dochi.sinks.file_sink_2.type = file_roll
agent_dochi.sinks.file_sink_2.channel = file_chnl
agent_dochi.sinks.file_sink_2.sink.rollInterval = 0
agent_dochi.sinks.file_sink_2.sink.directory = C:/work/apache-flume-1.9.0-bin/logs
agent_dochi.sinks.file_sink_2.sink.pathManager.prefix = file_to_sink2_
agent_dochi.sinks.file_sink_2.sink.pathManager.extension = log
 
agent_dochi.sinks.file_sink_3.type = file_roll
agent_dochi.sinks.file_sink_3.channel = file_chnl
agent_dochi.sinks.file_sink_3.sink.rollInterval = 0
agent_dochi.sinks.file_sink_3.sink.directory = C:/work/apache-flume-1.9.0-bin/logs
agent_dochi.sinks.file_sink_3.sink.pathManager.prefix = file_to_sink3_
agent_dochi.sinks.file_sink_3.sink.pathManager.extension = log
cs

         - 라인수가 많아서 복잡해 보일 수 있지만 같은 내용이 반복되는 것이므로 천천히 살펴보자.

         - 5 ln: 2개의 Channel Component 정의.

         - 6 ln: 6개의 Sink Component 정의. ( 구분하기 쉽게 이름에 Channel에 대한 별칭을 기재 )

         - 9 ln: Netcat Source에 2개의 Channel 연결.

         - 15~17 ln: Memory Channel 설정.

         - 20~25 ln: *File Channel 설정.

         - 29~34 ln: *File Roll Sink 설정이며 Memory Channel을 사용.

         - 36~41 ln, 43~48 ln은 Sink명만 바꿔서 반복.

         - 52~57 ln: File Roll Sink 설정이며 File Channel을 사용.

         - 59~64 ln, 66~71 ln은 Sink명만 바꿔서 반복.

 

   2-2. *File Channel

         - Source에서 받은 데이터를 File에 저장하고 처리내역을 주기별로 CheckPoint에 기록하는 Channel.

         - 처리이력을 기록하기 때문에 버퍼를 사용하는 Memory Channel에 비해 데이터의 유실율이 낮음.

         - Disk I/O가 발생하기 때문에 성능이 떨어짐.

 

   2-3. *File Roll Sink

         - Channel에서 읽어들인 데이터를 파일에 저장하는 Sink.

         - 현재시간이 숫자로 치환된 값이 파일명으로 저장됨.

         - [ sink.rollInterval ]: 주기별로 파일을 새로 생성하는 옵션이며, 기본값은 30초. 0을 입력하면 생성하지않음.

         - [ sink.directory ]: 로그를 생성할 폴더 경로.

         - [ sink.pathManager.prefix ]: 파일명 앞에 붙일 텍스트.

         - [ sink.pathManager.extension ]: 확장자.

 

   2-4. 실행.

         - 지난 포스트에서 작성한 [ flume_start.bat ] 파일 실행.

 

   2-5. Telnet 접속.

1
telnet localhost 44444
cs

         - 정상적으로 실행되면 그냥 까만화면만 보여짐.

 

 

3. 실행 결과 확인.

   3-1. 로그파일 생성 확인.

         - 각 Sink별 로그파일이 생성된 것이 확인됨.

 

   3-2. Telnet 메시지 전송.

         - 메시지를 입력하고 보내면 'OK'라는 메시지가 출력됨.

         - 분산처리가 되는지 알아보기 쉽게 1부터 순차적으로 입력해보자. ( ex: 1~20 )

         - 빠르게 입력도 해보고 천천히 입력도 해보자.

 

   3-3. 로그파일 적재 확인.

         - 표면적으로보면 로그파일의 용량이 증가한 것으로 확인됨.

         - 로그를 하나하나 열어서 확인해보자.

         - 공통적으로 입력한 메시지가 [ file_to_sink ]와 [ mem_to_sink ]에 동일하게 적재된 것으로 확인되고, 메시지가 분산되어 Sink별로 적재된 것으로 확인됨.

 

File Channel To Sink

- File Channel To Sink

- 메시지를 빠르게 입력하면 주로 1개의 Sink가 처리하는 것으로 확인됨.

- 메시지를 천천히 입력하면 나뉘어서 적재되는 것으로 확인됨.

- I/O를 줄이기위해서 먼저 File에 접근한 Sink에게 작업이 몰리는 것으로 파악됨.

- 하나의 Sink가 처리할 때 나머지는 대기중이므로 주기적으로 한번에 많은 양의 데이터가 적재되는 프로세스에서는 비효율적일 수 있음.

 

 

 

 

- Memory Channel To Sink

- 빠르게 적재하던 천천히 적재하던 File Channel To Sink 보다 고르게 적재됨.

- 모든 Sink가 작업을 처리하여 매우 효율적임.

- 그러나, 적재도중 중단되면 Buffer에 쌓인 데이터가 증발하는 것이 단점임.

 

 

 

 

4. 마치며.

    - Flume의 분산처리에 대해서 간략하게 알아보고, Source에 File Channel과 Memory Channel을 붙이고 여러개의 Sink를 연결하여 File로 출력해보는 실습까지 해보았다.

    - 분산처리는 많은 양의 데이터를 나눠서 작업하여 빠르게 처리할 수 있는 장점이 있지만 최종 적재되는 데이터는 순서가 없기 때문에 주의해야 한다.

댓글