apache-flume-1.7.x配置安裝
本文內容主要參考自Apache Flume使用者文件(http://flume.apache.org/FlumeUserGuide.html),由於關於Apache Flume 1.X的中文參考資料不是很多,所以這裡將我部署的過程記錄下來,希望能給有同樣需要的人們有一些提示作用。
(英文文件的內容很多,這裡只寫一些我自己用到的)
Overview
Apache Flume 是一個高效的分散式日誌收集系統,可以將大量的日誌資料從不同的資料來源集中到一起。(PS:知道這些就夠了)
System Requirments
1、JDK 1.7+
2、充足的記憶體
3、磁碟還有可用空間
4、對有相應目錄的讀寫許可權
資料流模型
從圖上可以看到,每一個Agent 包含一個Source 一個channel 一個sink
source 可以理解為資料來源(日誌檔案、AVRO、… 有很多 看文件就能知道,我只用到了檔案)
sink 可以理解為資料目的地(同樣也有很多,我測試環境也是直接寫到檔案)
channel 可以理解為資料流管道(種類也有不少,文件中給的例子是用的記憶體,但是記憶體是不穩定的,所以我的測試環境也換成了檔案)
簡單表述三者作用(不嚴謹表述):source 讀取日誌資料將其寫入channel中,sink從channel中讀取資料然後寫到其指定的地方。這裡如果sink寫失敗,那麼資料就會一直在channel中堆積直到sink恢復正常(這樣就確保了日誌資料不會丟失)
多個 Apache Flume Agent 還可以連線在一起,模型如下圖所示
知道了以上內容就可以開始搭建測試環境了
硬體環境
三臺伺服器IP地址分別為192.168.0.101~103,全部使用linux ubuntu 12.04 server 作業系統
系統結構
安裝過程
wget http://mirrors.cnnic.cn/apache/flume/1.7.0/apache-flume-1.7.0-bin.tar.gz #下載壓縮包
tar -xvzf apache-flume*.tar.gz #解壓
mv apache-flume /data/local/flume #本人比較喜歡把把軟體安裝在/data/local目錄下
配置
這裡我直接把我本地的配置發上來
# flume.conf: A Flume configuration
# Agent a1
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# source 配置
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /data/logs/system.log
# sink 配置
a1.sinks.k1.type=avro
a1.sinks.k1.hostname=192.168.0.101
a1.sinks.k1.port=4545
# channel 配置
a1.channels.c1.type = file
a1.channels.c1.checkpointDir=/data/logs/channels/a1/checkpoint
a1.channels.c1.dataDirs = /data/logs/channels/a1/data
# 繫結source、single到channel上
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
#ageng a2
a2.sources=r2
a2.sinks=k2
a2.channels=c2
#a2 source 配置
a2.sources.r2.type=avro
a2.sources.r2.bind=192.168.0.101
a2.sources.r2.port=4545
#a2 sink 配置 將合併後的日誌資料寫到/data/local/collector目錄下
a2.sinks.k2.type = file_roll
a2.sinks.k2.sink.directory = /data/local/collector
a2.sinks.k2.sink.rollInterval=3600
##下面是註釋掉的程式碼為配置sink ,日誌按天合併後儲存到單獨的資料夾中
#a2.sinks.k2.type=hdfs
#a2.sinks.k2.hdfs.path=hdfs://hadoop-master:9000/events/%y-%m-%d
#a2.sinks.k2.hdfs.filePrefix=events-
#a2.sinks.k2.hdfs.rollInterval=0
#a2.sinks.k2.hdfs.rollSize=0
#a2.sinks.k2.hdfs.rollCount=0
#a2.sinks.k2.hdfs.useLocalTimeStamp=true
#a2 channel配置
a2.channels.c2.type = file
a2.channels.c2.checkpointDir=/data/logs/channels/a4/checkpoint
a2.channels.c2.dataDirs = /data/logs/channels/a4/data
# 繫結source、single到channel上
a2.sources.r2.channels=c4
a2.sinks.k2.channel=c4
說明:
執行
在192.168.0.101上使用下面命令啟動Agent2(a2)
bin/flume-ng agent --conf conf --conf-file ./conf/flume.conf --name a2 -Dflume.root.logger=INFO,console
在192.168.0.101另啟動一個終端,執行下面命令啟動Agent1(a1)
bin/flume-ng agent --conf conf --conf-file ./conf/flume.conf --name a1 -Dflume.root.logger=INFO,console
分別在192.168.0.102~103上同樣啟動Agent1(a1)
bin/flume-ng agent --conf conf --conf-file ./conf/flume.conf --name a1 -Dflume.root.logger=INFO,console
生成測試資料的python小程式
#!/usr/bin/python
import os
import random
from time import ctime,sleep
for i in range(1,1000000):
smil=random.randint(50,100)
print smil/1000.0
com="echo \"hello message from 202\t"+str(i)+"\">> /data/logs/system.log";
print com
os.system(com)
sleep(smil/1000.0)
測試結果
可以看到在目錄/data/logs/collector 目錄下生成了多個合併後的日誌檔案
PS:
建議大家閱讀Flume的文件,雖然英文讀起來比較累但是大家搞技術的誰不懂點英文呢,所以下點功夫還是能看懂的。
如果通過本文仍不能理解Flume的工作流程,建議大家學習文件中給出的 A simple example 。(下面作個簡單解釋)
# example.conf: A single-node Flume configuration
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# Describe the sink
a1.sinks.k1.type = logger
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
原文:This configuration defines a single agent named a1. a1 has a source that listens for data on port 44444, a channel that buffers event data in memory, and a sink that logs event data to the console.
譯:這個配置定義了一個名稱為a1的agent。a1有一個source 監聽埠44444 (接收44444埠的任何收到的資料),一個記憶體管道(channel)將所有接收到的資料都暫存在記憶體當中,一個sink 將收到的資料列印到控臺。
$ bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=INFO,console
執行上述命令後在另外一個命令視窗執行(沒有telnet? apt-get install telnet 或者yum install telnet 安裝 )
$ telnet localhost 44444
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
Hello world! <ENTER>
OK
我們可以看到Flume 的控臺打印出
12/06/19 15:32:19 INFO source.NetcatSource: Source starting
12/06/19 15:32:19 INFO source.NetcatSource: Created serverSocket:sun.nio.ch.ServerSocketChannelImpl[/127.0.0.1:44444]
12/06/19 15:32:34 INFO sink.LoggerSink: Event: { headers:{} body: 48 65 6C 6C 6F 20 77 6F 72 6C 64 21 0D Hello world!. }