Flume是一個分佈式的,效率高的用來收集日誌數據的開源框架。它的架構是基於流式數據,有3個重要的組件,分別是Source,Channel和Sink。web
Flume架構圖如上,很是簡單。apache
一個Flume的事件(event)表示數據流中的一個單位,它會帶有字節數據和可選的字符串屬性。一個Flume的agent是一個JVM進程,agent持有3個組件,這3個組件分別是Source,Channel和Sink。服務器
Source組件會消費來自外部的一些事件源數據,這個外部事件源好比是一個web服務器。外部事件源會將事件以某種格式發送給Flume的Source,當Source接收到事件以後,會存儲到一個或多個Channel中。架構
Channel是一個被動型的存儲容器,它會一直保留事件直到事件被Sink消費。框架
Sink會消費Channel裏的事件,而後會將事件放到外部倉庫裏,好比hdfs;或者Sink會轉發到下一步Flume agent裏作重複的事情。異步
Source和Sink在agent裏異步執行處理channel裏的事件。分佈式
Flume內部提供了一些經常使用的Source,Channel和Sink。日誌
舉個例子:code
Source使用Spooling Directory Source,這個Source會讀取文件系統中的文件數據(文件系統中的外部數據至關於以前說的事件源),讀取數據以後會放到Channel中,好比使用Memory Channel,將Source接收到的事件存儲到內存中,最後使用HDFS這個Sink將Memory Channel中的事件數據寫入到hdfs中。進程
Spooling Directory Source, Memory Channel, HDFS Sink都是Flume內部提供的組件。
Flume很是可靠。每一個agent的事件從Source進入到Channel以後,會存儲在Channel中。這些事件只有在存儲到下一步agent的Channel中或者外部存儲倉庫(好比hdfs)後,纔會在Channel中被移除。
Flume還會使用事務來保證事件處理過程。
Flume還具備很高的可恢復性。事件是存儲在channel中的,當使用File Channel的時候,當服務器掛了以後這些文件都還在,可是若是使用的是Memory Channel,就不具有容災性。
一個簡單的Flume配置以下:
# agent名字是a1,有1個source:r1, 1個sink:k1, 1個channel:c1 a1.sources = r1 a1.sinks = k1 a1.channels = c1 # 使用netcat source a1.sources.r1.type = netcat a1.sources.r1.bind = localhost a1.sources.r1.port = 44444 # 使用 logger sink a1.sinks.k1.type = logger # 使用memory channel,容器爲1000,事務容量爲100 a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # 將channel講source和sink關聯 a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1