Flume安裝配置實踐
-
Flume簡介
Flume是Cloudera提供的一個高可用的,高可靠的,分散式的海量日誌採集、聚合和傳輸的系統,Flume支援在日誌系統中定製各類資料傳送方,用於收集資料;同時,Flume提供對資料進行簡單處理,並寫到各種資料接受方(可定製)的能力。
-
系統功能
-
日誌收集
-
Flume最早是Cloudera提供的日誌收集系統,目前是Apache下的一個孵化專案,Flume支援在日誌系統中定製各類資料傳送方,用於收集資料。
-
資料處理
Flume提供對資料進行簡單處理,並寫到各種資料接受方(可定製)的能力 Flume提供了從console(控制檯)、RPC(Thrift-RPC)、text(檔案)、tail(UNIX tail)、syslog(syslog日誌系統,支援TCP和UDP等2種模式),exec(命令執行)等資料來源上收集資料的能力。
-
工作方式
Flume採用了多Master的方式。為了保證配置資料的一致性,Flume[1] 引入了ZooKeeper,用於儲存配置資料,ZooKeeper本身可保證配置資料的一致性和高可用,另外,在配置資料發生變化時,ZooKeeper可以通知Flume Master節點。Flume Master間使用gossip協議同步資料。
-
流程結構
Flume的結構主要分為三部分:source、channel以及sink.其中source為源頭,負責採集日誌;channel為通道,負責傳輸和暫時儲存;sink為目的地,將採集到的日誌儲存起來。在真正日誌採集的過程中,根據待採集日誌的型別以及儲存需求,選擇相應的型別的source、channel和sink進行配置,從而將日誌採集並且儲存起來。
-
Flume採集日誌方案
-
需求分析
-
日誌分類
-
-
作業系統:linux
日誌更新型別:產生新日誌,原日誌結尾處追加
-
採集時間需求
採集週期:短週期(一天之內)
-
採集方案
-
採集構架
-
使用flume採集日誌檔案的過程較簡潔,只需選擇恰當的source、channel和sink並且配置起來即可,若有特殊需求也可自己進行二次開發實現個人需求。
具體過程為:按照需求配置一個agent,選取適當的source和sink,然後啟動該agent,開始採集日誌。
-
source
flume提供多種source供使用者進行選擇,儘可能多的滿足大部分日誌採集的需求,常用的source的型別包括avro、exec、netcat、spooling-directory和syslog等。具體的使用範圍和配置方法詳見
-
channel
flume中的channel不如source和sink那麼重要,但卻是不可忽視的組成部分。常用的channel為memory-channel,同時也有其他型別的channel,如JDBC、file-channel、custom-channel等,詳情見channel.
-
sink
flume的sink也有很多種,常用的包括avro、logger、HDFS、hbase以及file-roll等,除此之外還有其他型別的sink,如thrift、IRC、custom等。具體的使用範圍和使用方法詳見sink.
-
Flume處理日誌
Flume不止可以採集日誌,還可以對日誌進行簡單的處理,在source處可以通過interceptor對日誌正文處的重要內容進行過濾提取,在channel處可以通過header進行分類,將不同型別的日誌投入不同的通道中,在sink處可以通過正則序列化來將正文內容進行進一步的過濾和分類。
-
Flume Source Interceptors
Flume可以通過interceptor將重要資訊提取出來並且加入到header中,常用的interceptor有時間戳、主機名和UUID等,使用者也可以根據個人需求編寫正則過濾器,將某些特定格式的日誌內容過濾出來,以滿足特殊需求。
-
Flume Channel Selectors
Flume可以根據需求將不同的日誌傳輸進不同的channel,具體方式有兩種:複製和多路傳輸。複製就是不對日誌進行分組,而是將所有日誌都傳輸到每個通道中,對所有通道不做區別對待;多路傳輸就是根據指定的header將日誌進行分類,根據分類規則將不同的日誌投入到不同的channel中,從而將日誌進行人為的初步分類。
-
Flume Sink Processors
Flume在sink處也可以對日誌進行處理,常見的sink處理器包括custom、failover、load balancing和default等,和interceptor一樣,使用者也可以根據特殊需求使用正則過濾處理器,將日誌內容過濾出來,但和interceptor不同的是在sink處使用正則序列化過濾出的內容不會加入到header中,從而不會使日誌的header顯得過於臃腫。
-
附錄
-
常見的source
-
avro source
-
-
avro可以監聽和收集指定埠的日誌,使用avro的source需要說明被監聽的主機ip和埠號,下面給出一個具體的例子:
a1.sources = r1
a1.channels = c1
a1.sources.r1.type = avro
a1.sources.r1.channels = c1
a1.sources.r1.bind = 0.0.0.0
a1.sources.r1.port = 4141
-
exec source
exec可以通過指定的操作對日誌進行讀取,使用exec時需要指定shell命令,對日誌進行讀取,下面給出一個具體的例子:
a1.sources = r1
a1.channels = c1
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /var/log/secure
a1.sources.r1.channels = c1
-
spooling-directory source
spo_dir可以讀取資料夾裡的日誌,使用時指定一個資料夾,可以讀取該資料夾中的所有檔案,需要注意的是該資料夾中的檔案在讀取過程中不能修改,同時檔名也不能修改。下面給出一個具體的例子:
agent-1.channels = ch-1
agent-1.sources = src-1
agent-1.sources.src-1.type = spooldir
agent-1.sources.src-1.channels = ch-1
agent-1.sources.src-1.spoolDir = /var/log/apache/flumeSpool
agent-1.sources.src-1.fileHeader = true
-
syslog source
syslog可以通過syslog協議讀取系統日誌,分為tcp和udp兩種,使用時需指定ip和埠,下面給出一個udp的例子:
a1.sources = r1
a1.channels = c1
a1.sources.r1.type = syslogudp
a1.sources.r1.port = 5140
a1.sources.r1.host = localhost
a1.sources.r1.channels = c1
-
常見的channel
Flume的channel種類並不多,最常用的是memory channel,下面給出例子:
a1.channels = c1
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 10000
a1.channels.c1.byteCapacityBufferPercentage = 20
a1.channels.c1.byteCapacity = 800000
-
常見的sink
-
logger sink
-
logger顧名思義,就是將收集到的日誌寫到flume的log中,是個十分簡單但非常實用的sink
-
avro sink
avro可以將接受到的日誌傳送到指定埠,供級聯agent的下一跳收集和接受日誌,使用時需要指定目的ip和埠:例子如下:
a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = avro
a1.sinks.k1.channel = c1
a1.sinks.k1.hostname = 10.10.10.10
a1.sinks.k1.port = 4545
-
file roll sink
file_roll可以將一定時間內收集到的日誌寫到一個指定的檔案中,具體過程為使用者指定一個資料夾和一個週期,然後啟動agent,這時該資料夾會產生一個檔案將該週期內收集到的日誌全部寫進該檔案內,直到下一個週期再次產生一個新檔案繼續寫入,以此類推,周而復始。下面給出一個具體的例子:
a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = file_roll
a1.sinks.k1.channel = c1
a1.sinks.k1.sink.directory = /var/log/flume
-
hdfs sink
hdfs與file roll有些類似,都是將收集到的日誌寫入到新建立的檔案中儲存起來,但區別是file roll的檔案儲存路徑為系統的本地路徑,而hdfs的儲存路徑為分散式的檔案系統hdfs的路徑,同時hdfs建立新檔案的週期可以是時間,也可以是檔案的大小,還可以是採集日誌的條數。具體例項如下:
a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = hdfs
a1.sinks.k1.channel = c1
a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S
a1.sinks.k1.hdfs.filePrefix = events-
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.roundUnit = minute
-
hbase sink
hbase是一種資料庫,可以儲存日誌,使用時需要指定儲存日誌的表名和列族名,然後agent就可以將收集到的日誌逐條插入到資料庫中。例子如下:
a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = hbase
a1.sinks.k1.table = foo_table
a1.sinks.k1.columnFamily = bar_cf
a1.sinks.k1.serializer = org.apache.flume.sink.hbase.RegexHbaseEventSerializer
a1.sinks.k1.channel = c1