系統:CentOS6.5
JDK:1.8.0_144
Flume:flume-ng-1.6.0-cdh5.12.0
一、什麼是Flume
flume 作為 cloudera 開發的實時日志收集系統,受到了業界的認可與廣泛應用。Flume 初始的發行版本目前被統稱為 Flume OG(original generation),屬于 cloudera。但随着 FLume 功能的擴充,Flume OG 代碼工程臃腫、核心元件設計不合理、核心配置不标準等缺點暴露出來,尤其是在 Flume OG 的最後一個發行版本 0.94.0 中,日志傳輸不穩定的現象尤為嚴重,為了解決這些問題,2011 年 10 月 22 号,cloudera 完成了 Flume-728,對 Flume 進行了裡程碑式的改動:重構核心元件、核心配置以及代碼架構,重構後的版本統稱為 Flume NG(next generation);改動的另一原因是将 Flume 納入 apache 旗下,cloudera Flume 改名為 Apache Flume。
flume的特點:
flume是一個分布式、可靠、和高可用的海量日志采集、聚合和傳輸的系統。支援在日志系統中定制各類資料發送方,用于收集資料;同時,Flume提供對資料進行簡單處理,并寫到各種資料接受方(比如文本、HDFS、Hbase等)的能力 。
flume的資料流由事件(Event)貫穿始終。事件是Flume的基本資料機關,它攜帶日志資料(位元組數組形式)并且攜帶有頭資訊,這些Event由Agent外部的Source生成,當Source捕獲事件後會進行特定的格式化,然後Source會把事件推入(單個或多個)Channel中。你可以把Channel看作是一個緩沖區,它将儲存事件直到Sink處理完該事件。Sink負責持久化日志或者把事件推向另一個Source。
flume的可靠性 :
當節點出現故障時,日志能夠被傳送到其他節點上而不會丢失。Flume提供了三種級别的可靠性保障,從強到弱依次分别為:end-to-end(收到資料agent首先将event寫到磁盤上,當資料傳送成功後,再删除;如果資料發送失敗,可以重新發送。),Store on failure(這也是scribe采用的政策,當資料接收方crash時,将資料寫到本地,待恢複後,繼續發送),Besteffort(資料發送到接收方後,不會進行确認)。
flume的可恢複性:
還是靠Channel。推薦使用FileChannel,事件持久化在本地檔案系統裡(性能較差)。
二、Flume工作原理
Flume的資料流由事件(Event)貫穿始終。事件是Flume的基本資料機關,它攜帶日志資料(位元組數組形式)并且攜帶有頭資訊,這些Event由Agent外部的Source生成,當Source捕獲事件後會進行特定的格式化,然後Source會把事件推入(單個或多個)Channel中。可以把Channel看作是一個緩沖區,它将儲存事件直到Sink處理完該事件。Sink負責持久化日志或者把事件推向另一個Source。以下是Flume的一些核心概念:
(1)Events:一個資料單元,帶有一個可選的消息頭,可以是日志記錄、avro 對象等。
(2)Agent:JVM中一個獨立的Flume程序,每台機器運作一個Agent,但一個Agent可以包含多個Source、Channel、Sink元件。
(3)Client:運作于一個獨立線程,用于生産資料并将其發送給Agent。
(4)Source:用來消費傳遞到該元件的Event,從Client收集資料,傳遞給Channel。
(5)Channel:中轉Event的一個臨時存儲,儲存Source元件傳遞過來的Event,其實就是連接配接 Source 和 Sink ,有點像一個消息隊列。
(6)Sink:從Channel收集資料,運作在一個獨立線程。
Flume以Agent為最小的獨立運作機關,一個Agent就是一個JVM。單Agent由Source、Sink和Channel三大元件構成,如下圖所示:

值得注意的是,Flume提供了大量内置的Source、Channel和Sink類型。不同類型的Source、Channel和Sink可以自由組合。組合方式基于使用者設定的配置檔案,非常靈活。比如:Channel可以把事件暫存在記憶體裡,也可以持久化到本地硬碟上;Sink可以把日志寫入HDFS、HBase、ES甚至是另外一個Source等等。Flume支援使用者建立多級流,也就是說多個Agent可以協同工作,并且支援Fan-in、Fan-out、Contextual Routing、Backup Routes,這也正是NB之處。如圖所示:
圖1
圖2
三、下載下傳安裝
1.需要JDK1.6+
2.下載下傳版本分為CDH和Apache版本,如果是個人機器叢集安裝,建議使用CDH版本,CDH的各元件的版本号要對應
CDH5各元件下載下傳位址:http://archive.cloudera.com/cdh5/cdh/5/
3.将下載下傳的包解壓出來之後就已經完成了50%,剩下的内容就需要修改一些配置檔案
4.設定環境變量
vim ~/.bash_profile
FLUME_HOME="/opt/module/flume"
export PATH=$PATH:$FLUME_HOME/bin
source ~/.bash_profile
驗證
/opt/module/flume/bin/flume-ng version
四、修改配置檔案
# 指定Agent的元件名稱
sunny.sources = so1
sunny.channels = ch1
sunny.sinks = si1
# 指定Flume source要監聽的路徑(logs/flume目錄要提前建立好)
sunny.sources.so1.type = spooldir
sunny.sources.so1.spoolDir = /usr/sunny/logs/flume
# 指定Flume sink
sunny.sinks.si1.type = logger
# 綁定source和sink到channel上
sunny.sinks.si1.channel = ch1
sunny.sources.so1.channels = ch1
# 指定Flume channel
sunny.channels.ch1.type = memory
sunny.channels.ch1.capacity = 1000
sunny.channels.ch1.transactionCapacity = 100
五、啟動
cd /opt/module/flume/
bin/flume-ng agent --conf conf --conf-file conf/flume.conf --name sunny -Dflume.root.logger=INFO,console
參數 | 作用 | 舉例 |
---|---|---|
–conf 或 -c | 指定配置檔案夾,包含flume-env.sh和log4j的配置檔案 | –conf conf |
–conf-file 或 -f | 配置檔案位址 | –conf-file conf/flume.conf |
–name 或 -n | agent名稱 | –name a1 |
-z | zookeeper連接配接字元串 | -z zkhost:2181,zkhost1:2181 |
-p | zookeeper中的存儲路徑字首 | -p /flume |
然後另開一個用戶端,新增一個日志檔案,編輯内容
cd /usr/sunny/logs/flume
vim test.log
在開啟的用戶端就可以看到内容
六、其他source
1.Avro
# 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 that 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
// 運作FlumeAgent,監聽本機的44444端口
$ flume-ng agent -c conf -f example/netcat.conf -n a1 -Dflume.root.logger=INFO,console
// 打開另一終端,通過telnet登入localhost的44444,輸入測試資料
$ telnet localhost 44444
2.Spool
Spool用于監測配置的目錄下新增的檔案,并将檔案中的資料讀取出來。需要注意兩點:拷貝到spool目錄下的檔案不可以再打開編輯、spool目錄下不可包含相應的子目錄。具體示例如下:
// 建立兩個Flume配置檔案
$ cd app/cdh/flume-1.6.0-cdh5.7.1
$ cp conf/flume-conf.properties.template example/spool1.conf
$ cp conf/flume-conf.properties.template example/spool2.conf
// 配置spool1.conf用于監控目錄avro_data的檔案,将檔案内容發送到本地60000端口
$ vim example/spool1.conf
# Namethe components
local1.sources= r1
local1.sinks= k1
local1.channels= c1
# Source
local1.sources.r1.type= spooldir
local1.sources.r1.spoolDir= /home/hadoop/avro_data
# Sink
local1.sinks.k1.type= avro
local1.sinks.k1.hostname= localhost
local1.sinks.k1.port= 60000
#Channel
local1.channels.c1.type= memory
# Bindthe source and sink to the channel
local1.sources.r1.channels= c1
local1.sinks.k1.channel= c1
// 配置spool2.conf用于從本地60000端口擷取資料并寫入HDFS
# Namethe components
a1.sources= r1
a1.sinks= k1
a1.channels= c1
# Source
a1.sources.r1.type= avro
a1.sources.r1.channels= c1
a1.sources.r1.bind= localhost
a1.sources.r1.port= 60000
# Sink
a1.sinks.k1.type= hdfs
a1.sinks.k1.hdfs.path= hdfs://localhost:9000/user/wcbdd/flumeData
a1.sinks.k1.rollInterval= 0
a1.sinks.k1.hdfs.writeFormat= Text
a1.sinks.k1.hdfs.fileType= DataStream
# Channel
a1.channels.c1.type= memory
a1.channels.c1.capacity= 10000
# Bind the source and sink to the channel
a1.sources.r1.channels= c1
a1.sinks.k1.channel= c1
// 分别打開兩個終端,運作如下指令啟動兩個Flume Agent
$ flume-ng agent -c conf -f example/spool2.conf -n a1
$ flume-ng agent -c conf -f example/spool1.conf -n local1
// 檢視本地檔案系統中需要監控的avro_data目錄内容
$ cd avro_data
$ cat avro_data.txt
Flume内置了大量的Source,其中Avro Source、Thrift Source、Spooling Directory Source、Kafka Source具有較好的性能和較廣泛的使用場景。下面是Source的一些參考資料:
(1)*******
(2)*******
(3)*******
(4)*******
(5)*******
(6)*******
(7)*******
(8)*******
七、Flume所支援的Sources、Channels、Sinks
Sources | Channels | Sinks |
---|---|---|
|
|
|