1、Flume簡介html
flume 做爲 cloudera 開發的實時日誌收集系統,受到了業界的承認與普遍應用。Flume 初始的發行版本目前被統稱爲 Flume OG(original generation),屬於 cloudera。java
但隨着 FLume 功能的擴展,Flume OG 代碼工程臃腫、核心組件設計不合理、核心配置不標準等缺點暴露出來,尤爲是在 Flume OG 的最後一個發行版本 0.9.4. 中,日nginx
志傳輸不穩定的現象尤其嚴重,爲了解決這些問題,2011 年 10 月 22 號,cloudera 完成了 Flume-728,對 Flume 進行了里程碑式的改動:重構核心組件、核心配置以數據庫
及代碼架構,重構後的版本統稱爲 Flume NG(next generation);改動的另外一緣由是將 Flume 歸入 apache 旗下,cloudera Flume 更名爲 Apache Flume。apache
備註:Flume參考資料json
官方網站: http://flume.apache.org/
用戶文檔: http://flume.apache.org/FlumeUserGuide.html
開發文檔: http://flume.apache.org/FlumeDeveloperGuide.html數組
flume是一個分佈式、可靠、和高可用的海量日誌採集、聚合和傳輸的系統。支持在日誌系統中定製各種數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,緩存
並寫到各類數據接受方(好比文本、HDFS、Hbase等)的能力 。
flume的數據流由事件(Event)貫穿始終。事件是Flume的基本數據單位,它攜帶日誌數據(字節數組形式)而且攜帶有頭信息,這些Event由Agent外部的Source生成,當tomcat
Source捕獲事件後會進行特定的格式化,而後Source會把事件推入(單個或多個)Channel中。你能夠把Channel看做是一個緩衝區,它將保存事件直到Sink處理完該事件。服務器
Sink負責持久化日誌或者把事件推向另外一個Source。
1)flume的可靠性
當節點出現故障時,日誌可以被傳送到其餘節點上而不會丟失。Flume提供了三種級別的可靠性保障,從強到弱依次分別爲:end-to-end(收到數據agent首先將
event寫到磁盤上,當數據傳送成功後,再刪除;若是數據發送失敗,能夠從新發送。),Store on failure(這也是scribe採用的策略,當數據接收方crash時,將
數據寫到本地,待恢復後,繼續發送),Besteffort(數據發送到接收方後,不會進行確認)。
2)flume的可恢復性
仍是靠Channel。推薦使用FileChannel,事件持久化在本地文件系統裏(性能較差)。
Client:Client生產數據,運行在一個獨立的線程。
Event: 一個數據單元,消息頭和消息體組成。(Events能夠是日誌記錄、 avro 對象等。)
Flow: Event從源點到達目的點的遷移的抽象。
Agent: 一個獨立的Flume進程,包含組件Source、 Channel、 Sink。(Agent使用JVM 運行Flume。每臺機器運行一個agent,可是能夠在一個agent中包含
多個sources和sinks。)
Source: 數據收集組件。(source從Client收集數據,傳遞給Channel)
Channel: 中轉Event的一個臨時存儲,保存由Source組件傳遞過來的Event。(Channel鏈接 sources 和 sinks ,這個有點像一個隊列。)
Sink: 從Channel中讀取並移除Event, 將Event傳遞到FlowPipeline中的下一個Agent(若是有的話)(Sink從Channel收集數據,運行在一個獨立線程。)
Flume 運行的核心是 Agent。Flume以agent爲最小的獨立運行單位。一個agent就是一個JVM。它是一個完整的數據收集工具,含有三個核心組件,分別是
source、 channel、 sink。經過這些組件, Event 能夠從一個地方流向另外一個地方,以下圖所示。
Source是數據的收集端,負責將數據捕獲後進行特殊的格式化,將數據封裝到事件(event) 裏,而後將事件推入Channel中。 Flume提供了不少內置的
Source, 支持 Avro, log4j, syslog 和 http post(body爲json格式)。可讓應用程序同已有的Source直接打交道,如AvroSource,
SyslogTcpSource。 若是內置的Source沒法知足須要, Flume還支持自定義Source。
source類型:
Channel是鏈接Source和Sink的組件,你們能夠將它看作一個數據的緩衝區(數據隊列),它能夠將事件暫存到內存中也能夠持久化到本地磁盤上, 直
到Sink處理完該事件。介紹兩個較爲經常使用的Channel, MemoryChannel和FileChannel。
Channel類型:
Sink從Channel中取出事件,而後將數據發到別處,能夠向文件系統、數據庫、 hadoop存數據, 也能夠是其餘agent的Source。在日誌數據較少時,可
以將數據存儲在文件系統中,而且設定必定的時間間隔保存數據。
Sink類型:
當咱們須要對數據進行過濾時,除了咱們在Source、 Channel和Sink進行代碼修改以外, Flume爲咱們提供了攔截器,攔截器也是chain形式的。
攔截器的位置在Source和Channel之間,當咱們爲Source指定攔截器後,咱們在攔截器中會獲得event,根據需求咱們能夠對event進行保留仍是
拋棄,拋棄的數據不會進入Channel中。
1)Flume 的核心是把數據從數據源收集過來,再送到目的地。爲了保證輸送必定成功,在送到目的地以前,會先緩存數據,待數據真正到達目的地後,
刪除本身緩存的數據。
2) Flume 傳輸的數據的基本單位是 Event,若是是文本文件,一般是一行記錄,這也是事務的基本單位。 Event 從 Source,流向 Channel,再到 Sink,
自己爲一個 byte 數組,並可攜帶 headers 信息。 Event 表明着一個數據流的最小完整單元,從外部數據源來,向外部的目的地去。
值得注意的是,Flume提供了大量內置的Source、Channel和Sink類型。不一樣類型的Source,Channel和Sink能夠自由組合。組合方式基於用戶設置的配置文件,很是靈活。
好比:Channel能夠把事件暫存在內存裏,也能夠持久化到本地硬盤上。Sink能夠把日誌寫入HDFS, HBase,甚至是另一個Source等等。Flume支持用戶創建多級流,
也就是說,多個agent能夠協同工做,而且支持Fan-in、Fan-out、Contextual Routing、Backup Routes,這也正是Flume強大之處。以下圖所示:
Flume 使用事務性的方式保證傳送Event整個過程的可靠性。 Sink 必須在Event 被存入 Channel 後,或者,已經被傳達到下一站agent裏,又或者,
已經被存入外部數據目的地以後,才能把 Event 從 Channel 中 remove 掉。這樣數據流裏的 event 不管是在一個 agent 裏仍是多個 agent 之間流轉,
都能保證可靠,由於以上的事務保證了 event 會被成功存儲起來。好比 Flume支持在本地保存一份文件 channel 做爲備份,而memory channel 將
event存在內存 queue 裏,速度快,但丟失的話沒法恢復。
Flume在英文中的意思是水道, 但Flume更像能夠隨意組裝的消防水管,下面根據官方文檔,展現幾種Flow。
能夠將多個Agent順序鏈接起來,將最初的數據源通過收集,存儲到最終的存儲系統中。這是最簡單的狀況,通常狀況下,應該控制這種順序鏈接的
Agent 的數量,由於數據流經的路徑變長了,若是不考慮failover的話,出現故障將影響整個Flow上的Agent收集服務。
這種狀況應用的場景比較多,好比要收集Web網站的用戶行爲日誌, Web網站爲了可用性使用的負載集羣模式,每一個節點都產生用戶行爲日誌,能夠爲
每 個節點都配置一個Agent來單獨收集日誌數據,而後多個Agent將數據最終匯聚到一個用來存儲數據存儲系統,如HDFS上。
Flume還支持多級流,什麼多級流?結合在雲開發中的應用來舉個例子,當syslog, java, nginx、 tomcat等混合在一塊兒的日誌流開始流入一個agent
後,能夠agent中將混雜的日誌流分開,而後給每種日誌創建一個本身的傳輸通道。
5.四、load balance功能
上圖Agent1是一個路由節點,負責將Channel暫存的Event均衡到對應的多個Sink組件上,而每一個Sink組件分別鏈接到一個獨立的Agent上 。
Flume主要由3個重要的組件構成:
1)Source: 完成對日誌數據的收集,分紅transtion 和 event 打入到channel之中
Flume提供了各類source的實現,包括Avro Source、 Exce Source、 Spooling
Directory Source、 NetCat Source、 Syslog Source、 Syslog TCP Source、
Syslog UDP Source、 HTTP Source、 HDFS Source, etc。
2)Channel: Flume Channel主要提供一個隊列的功能,對source提供中的數據進行簡單的緩存。
Flume對於Channel, 則提供了Memory Channel、 JDBC Chanel、 File Channel,etc
3)Sink: Flume Sink取出Channel中的數據,進行相應的存儲文件系統,數據庫,或者提交到遠程服務器。
包括HDFS sink、 Logger sink、 Avro sink、 File Roll sink、 Null sink、 HBasesink, etc。
Spool Source 如何使用?
在實際使用的過程當中,能夠結合log4j使用,使用log4j的時候,將log4j的文件分割機制設爲1分鐘一次,將文件拷貝到spool的監控目錄。
log4j有一個TimeRolling的插件,能夠把log4j分割的文件到spool目錄。基本實現了實時的監控。 Flume在傳完文件以後,將會修 改文
件的後綴,變爲.COMPLETED(後綴也能夠在配置文件中靈活指定)
Exec Source 和Spool Source 比較
1) ExecSource能夠實現對日誌的實時收集,可是存在Flume不運行或者指令執行出錯時,將沒法收集到日誌數據,沒法何證日誌數據
的完整性。
2) SpoolSource雖然沒法實現實時的收集數據,可是可使用以分鐘的方式分割文件,趨近於實時。
3)總結:若是應用沒法實現以分鐘切割日誌文件的話,能夠兩種 收集方式結合使用。
1)MemoryChannel能夠實現高速的吞吐, 可是沒法保證數據完整性
2)MemoryRecoverChannel在官方文檔的建議上已經建義使用FileChannel來替換。
FileChannel保證數據的完整性與一致性。在具體配置不現的FileChannel時,建議FileChannel設置的目錄和程序日誌文件保存的目錄
設成不一樣的磁盤,以便提升效率。
Flume Sink在設置存儲數據時,能夠向文件系統中,數據庫中, hadoop中儲數據,在日誌數據較少時,能夠將數據存儲在文件系中,並
且設定必定的時間間隔保存數據。在日誌數據較多時,能夠將相應的日誌數據存儲到Hadoop中,便於往後進行相應的數據分析。