Flume

一、Flume簡介

  flume 作爲 cloudera 開發的實時日誌收集系統,受到了業界的認可與廣泛應用。Flume 初始的發行版本目前被統稱爲 Flume OG(original generation),屬於 cloudera。

  但隨着 FLume 功能的擴展,Flume OG 代碼工程臃腫、核心組件設計不合理、核心配置不標準等缺點暴露出來,尤其是在 Flume OG 的最後一個發行版本 0.9.4. 中,日

  志傳輸不穩定的現象尤爲嚴重,爲了解決這些問題,2011 年 10 月 22 號,cloudera 完成了 Flume-728,對 Flume 進行了里程碑式的改動:重構核心組件、核心配置以

  及代碼架構,重構後的版本統稱爲 Flume NG(next generation);改動的另一原因是將 Flume 納入 apache 旗下,cloudera Flume 改名爲 Apache Flume。

  備註:Flume參考資料

    官方網站: http://flume.apache.org/
    用戶文檔: http://flume.apache.org/FlumeUserGuide.html
    開發文檔: http://flume.apache.org/FlumeDeveloperGuide.html

二、Flume特點

  flume是一個分佈式、可靠、和高可用的海量日誌採集、聚合和傳輸的系統。支持在日誌系統中定製各類數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,

  並寫到各種數據接受方(比如文本、HDFS、Hbase等)的能力 。
  flume的數據流由事件(Event)貫穿始終。事件是Flume的基本數據單位,它攜帶日誌數據(字節數組形式)並且攜帶有頭信息,這些Event由Agent外部的Source生成,當

  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,事件持久化在本地文件系統裏(性能較差)。

三、Flume的一些核心概念

  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收集數據,運行在一個獨立線程。)

3.1、Agent結構  

  Flume 運行的核心是 Agent。Flume以agent爲最小的獨立運行單位。一個agent就是一個JVM。它是一個完整的數據收集工具,含有三個核心組件,分別是

   source、 channel、 sink。通過這些組件, Event 可以從一個地方流向另一個地方,如下圖所示。

  

3.2、source

  Source是數據的收集端,負責將數據捕獲後進行特殊的格式化,將數據封裝到事件(event) 裏,然後將事件推入Channel中。 Flume提供了很多內置的
  Source, 支持 Avro, log4j, syslog 和 http post(body爲json格式)。可以讓應用程序同已有的Source直接打交道,如AvroSource,
  SyslogTcpSource。 如果內置的Source無法滿足需要, Flume還支持自定義Source。
  

  source類型:

  

3.3、Channel

  Channel是連接Source和Sink的組件,大家可以將它看做一個數據的緩衝區(數據隊列),它可以將事件暫存到內存中也可以持久化到本地磁盤上, 直
  到Sink處理完該事件。介紹兩個較爲常用的Channel, MemoryChannel和FileChannel。
  

  Channel類型:

  

3.4、Sink

  Sink從Channel中取出事件,然後將數據發到別處,可以向文件系統、數據庫、 hadoop存數據, 也可以是其他agent的Source。在日誌數據較少時,可
  以將數據存儲在文件系統中,並且設定一定的時間間隔保存數據。

  

  Sink類型:

  

回到頂部(go to top)

四、Flume攔截器、數據流以及可靠性

4.1、Flume攔截器

  當我們需要對數據進行過濾時,除了我們在Source、 Channel和Sink進行代碼修改之外, Flume爲我們提供了攔截器,攔截器也是chain形式的。

  攔截器的位置在Source和Channel之間,當我們爲Source指定攔截器後,我們在攔截器中會得到event,根據需求我們可以對event進行保留還是

  拋棄,拋棄的數據不會進入Channel中。

  

4.2、Flume數據流

  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強大之處。如下圖所示:

  

4.3、Flume可靠性

  Flume 使用事務性的方式保證傳送Event整個過程的可靠性。 Sink 必須在Event 被存入 Channel 後,或者,已經被傳達到下一站agent裏,又或者,

  已經被存入外部數據目的地之後,才能把 Event 從 Channel 中 remove 掉。這樣數據流裏的 event 無論是在一個 agent 裏還是多個 agent 之間流轉,

  都能保證可靠,因爲以上的事務保證了 event 會被成功存儲起來。比如 Flume支持在本地保存一份文件 channel 作爲備份,而memory channel 將

  event存在內存 queue 裏,速度快,但丟失的話無法恢復。

回到頂部(go to top)

五、Flume使用場景

  Flume在英文中的意思是水道, 但Flume更像可以隨意組裝的消防水管,下面根據官方文檔,展示幾種Flow。

5.1、多個agent順序連接

  

  可以將多個Agent順序連接起來,將最初的數據源經過收集,存儲到最終的存儲系統中。這是最簡單的情況,一般情況下,應該控制這種順序連接的
  Agent 的數量,因爲數據流經的路徑變長了,如果不考慮failover的話,出現故障將影響整個Flow上的Agent收集服務。 

5.2、多個Agent的數據匯聚到同一個Agent 

  

  這種情況應用的場景比較多,比如要收集Web網站的用戶行爲日誌, Web網站爲了可用性使用的負載集羣模式,每個節點都產生用戶行爲日誌,可以爲
  每 個節點都配置一個Agent來單獨收集日誌數據,然後多個Agent將數據最終匯聚到一個用來存儲數據存儲系統,如HDFS上。

5.3、多級流

  Flume還支持多級流,什麼多級流?結合在雲開發中的應用來舉個例子,當syslog, java, nginx、 tomcat等混合在一起的日誌流開始流入一個agent
  後,可以agent中將混雜的日誌流分開,然後給每種日誌建立一個自己的傳輸通道。

  

5.4、load balance功能

  

  上圖Agent1是一個路由節點,負責將Channel暫存的Event均衡到對應的多個Sink組件上,而每個Sink組件分別連接到一個獨立的Agent上 。

回到頂部(go to top)

六、Flume核心組件

  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。

6.1、Source

  Spool Source 如何使用?
  在實際使用的過程中,可以結合log4j使用,使用log4j的時候,將log4j的文件分割機制設爲1分鐘一次,將文件拷貝到spool的監控目錄。

   log4j有一個TimeRolling的插件,可以把log4j分割的文件到spool目錄。基本實現了實時的監控。 Flume在傳完文件之後,將會修 改文

  件的後綴,變爲.COMPLETED(後綴也可以在配置文件中靈活指定)

  Exec Source 和Spool Source 比較
  1) ExecSource可以實現對日誌的實時收集,但是存在Flume不運行或者指令執行出錯時,將無法收集到日誌數據,無法何證日誌數據

    的完整性。
  2) SpoolSource雖然無法實現實時的收集數據,但是可以使用以分鐘的方式分割文件,趨近於實時。
  3)總結:如果應用無法實現以分鐘切割日誌文件的話,可以兩種 收集方式結合使用。

6.2、Channel

  1)MemoryChannel可以實現高速的吞吐, 但是無法保證數據完整性
  2)MemoryRecoverChannel在官方文檔的建議上已經建義使用FileChannel來替換。
    FileChannel保證數據的完整性與一致性。在具體配置不現的FileChannel時,建議FileChannel設置的目錄和程序日誌文件保存的目錄

    設成不同的磁盤,以便提高效率。 

6.3、Sink

  Flume Sink在設置存儲數據時,可以向文件系統中,數據庫中, hadoop中儲數據,在日誌數據較少時,可以將數據存儲在文件系中,並

  且設定一定的時間間隔保存數據。在日誌數據較多時,可以將相應的日誌數據存儲到Hadoop中,便於日後進行相應的數據分析。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章