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
- 메시지를 빠르게 입력하면 주로 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로 출력해보는 실습까지 해보았다.
- 분산처리는 많은 양의 데이터를 나눠서 작업하여 빠르게 처리할 수 있는 장점이 있지만 최종 적재되는 데이터는 순서가 없기 때문에 주의해야 한다.
'BIG-DATA > FLUME' 카테고리의 다른 글
[FLUME] 무작정 시작하기 (3) - Kafka Source (0) | 2019.12.03 |
---|---|
[FLUME] 무작정 시작하기 (1) - 설치 및 실행 (0) | 2019.11.29 |
댓글