http://blog.csdn.net/alphags/article/details/52862578?locationNum=10&fps=1
本文內容主要參考自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目錄下
1 2 3 配置
這裡我直接把我本地的配置發上來
# flume.conf: A Flume configuration# Agent a1a1.sources = r1a1.sinks = k1a1.channels = c1# source 配置a1.sources.r1.type = execa1.sources.r1.command = tail -F /data/logs/system.log# sink 配置a1.sinks.k1.type=avroa1.sinks.k1.hostname=192.168.0.101a1.sinks.k1.port=4545# channel 配置a1.channels.c1.type = filea1.channels.c1.checkpointDir=/data/logs/channels/a1/checkpointa1.channels.c1.dataDirs = /data/logs/channels/a1/data# 綁定source、single到channel上a1.sources.r1.channels = c1a1.sinks.k1.channel = c1#ageng a2a2.sources=r2a2.sinks=k2a2.channels=c2#a2 source 配置a2.sources.r2.type=avroa2.sources.r2.bind=192.168.0.101a2.sources.r2.port=4545#a2 sink 配置 將合并後的日誌資料寫到/data/local/collector目錄下a2.sinks.k2.type = file_rolla2.sinks.k2.sink.directory = /data/local/collectora2.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 = filea2.channels.c2.checkpointDir=/data/logs/channels/a4/checkpointa2.channels.c2.dataDirs = /data/logs/channels/a4/data# 綁定source、single到channel上a2.sources.r2.channels=c4a2.sinks.k2.channel=c4
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
說明: 運行
在192.168.0.101上使用下面命令啟動Agent2(a2)
bin/flume-ng agent --conf conf --conf-file ./conf/flume.conf --name a2 -Dflume.root.logger=INFO,console
1
在192.168.0.101另啟動一個終端,運行下面命令啟動Agent1(a1)
bin/flume-ng agent --conf conf --conf-file ./conf/flume.conf --name a1 -Dflume.root.logger=INFO,console
1
分別在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
1 產生測試資料的python小程式
#!/usr/bin/pythonimport osimport randomfrom time import ctime,sleepfor 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)
1 2 3 4 5 6 7 8 9 10 11 測試結果
可以看到在目錄/data/logs/collector 目錄下產生了多個合并後的記錄檔 PS:
建議大家閱讀Flume的文檔,雖然英文讀起來比較累但是大家搞技術的誰不懂點英文呢,所以下點功夫還是能看懂的。
如果通過本文仍不能理解Flume的工作流程,建議大家學習文檔中給出的 A simple example 。(下面作個簡單解釋)
# example.conf: A single-node Flume configuration# Name the components on this agenta1.sources = r1a1.sinks = k1a1.channels = c1# Describe/configure the sourcea1.sources.r1.type = netcata1.sources.r1.bind = localhosta1.sources.r1.port = 44444# Describe the sinka1.sinks.k1.type = logger# Use a channel which buffers events in memorya1.channels.c1.type = memorya1.channels.c1.capacity = 1000a1.channels.c1.transactionCapacity = 100# Bind the source and sink to the channela1.sources.r1.channels = c1a1.sinks.k1.channel = c1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
原文: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
1
執行上述命令後在另外一個命令視窗執行(沒有telnet。 apt-get install telnet 或者yum install telnet 安裝 )
$ telnet localhost 44444Trying 127.0.0.1...Connected to localhost.localdomain (127.0.0.1).Escape character is '^]'.Hello world! <ENTER>OK
1 2 3 4 5 6
我們可以看到Flume 的控台列印出
12/06/19 15:32:19 INFO source.NetcatSource: Source starting12/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!. } 1 2 3 著作權聲明:本文為博主原創文章,未經博主允許不得轉載。