Flume原理深度解析

一、Flume簡介

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

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

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

  及代碼架構,重構後的版本統稱爲 Flume NGnext 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提供對數據進行簡單處理,

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

  Source捕獲事件後會進行特定的格式化,然後Source會把事件推入(單個或多個)Channel。你可以把Channel看作是一個緩衝區,它將保存事件直到Sink處理完該事件

  Sink負責持久化日誌或者把事件推向另一個Source
 
  1flume的可靠性 
    當節點出現故障時,日誌能夠被傳送到其他節點上而不會丟失。Flume提供了三種級別的可靠性保障,從強到弱依次分別爲:end-to-end(收到數據agent首先將

    event寫到磁盤上,當數據傳送成功後,再刪除;如果數據發送失敗,可以重新發送。),Store on failure(這也是scribe採用的策略,當數據接收方crash時,將

    數據寫到本地,待恢復後,繼續發送),Besteffort(數據發送到接收方後,不會進行確認)。

  2flume的可恢復性
    還是靠Channel。推薦使用FileChannel,事件持久化在本地文件系統裏(性能較差)

三、Flume的一些核心概念

  ClientClient生產數據,運行在一個獨立的線程。

  Event 一個數據單元,消息頭和消息體組成。Events可以是日誌記錄、 avro 對象等。)
  Flow Event從源點到達目的點的遷移的抽象。
  Agent 一個獨立的Flume進程,包含組件Source Channel Sink。(Agent使用JVM 運行Flume。每臺機器運行一個agent,但是可以在一個agent中包含

      多個sourcessinks。)
  Source 數據收集組件。(sourceClient收集數據,傳遞給Channel
  Channel 中轉Event的一個臨時存儲,保存由Source組件傳遞過來的Event。(Channel連接 sources sinks ,這個有點像一個隊列。)
  Sink Channel中讀取並移除Event Event傳遞到FlowPipeline中的下一個Agent(如果有的話)(SinkChannel收集數據,運行在一個獨立線程。)

3.1Agent結構  

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

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

  https://images2017.cnblogs.com/blog/999804/201711/999804-20171108130603872-780242084.png

3.2source

  Source數據的收集端,負責將數據捕獲後進行特殊的格式化,將數據封裝到事件(event 裏,然後將事件推入Channel Flume提供了很多內置的
  Source 支持 Avro log4j syslog http post(bodyjson格式)。可以讓應用程序同已有的Source直接打交道,如AvroSource
  SyslogTcpSource 如果內置的Source無法滿足需要, Flume還支持自定義Source
  https://images2017.cnblogs.com/blog/999804/201711/999804-20171108130818481-670496307.png

  source類型:

  https://images2017.cnblogs.com/blog/999804/201711/999804-20171108130931325-512757774.png

3.3Channel

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

  Channel類型:

  https://images2017.cnblogs.com/blog/999804/201711/999804-20171108131248653-2068131817.png

3.4Sink

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

  https://images2017.cnblogs.com/blog/999804/201711/999804-20171108131438466-1752568401.png

  Sink類型:

  https://images2017.cnblogs.com/blog/999804/201711/999804-20171108131516809-1930573599.png

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

4.1Flume攔截器

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

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

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

  https://images2017.cnblogs.com/blog/999804/201711/999804-20171108132026106-567951153.png

4.2Flume數據流

  1Flume 的核心是把數據從數據源收集過來,再送到目的地。爲了保證輸送一定成功,在送到目的地之前會先緩存數據,待數據真正到達目的地後,

    刪除自己緩存的數據
  2 Flume 傳輸的數據的基本單位是 Event,如果是文本文件,通常是一行記錄,這也是事務的基本單位。 Event Source,流向 Channel,再到 Sink

    本身爲一個 byte 數組,並可攜帶 headers 信息。 Event 代表着一個數據流的最小完整單元,從外部數據源來,向外部的目的地去

  https://images2017.cnblogs.com/blog/999804/201711/999804-20171108132400294-760320145.png

  值得注意的是,Flume提供了大量內置的SourceChannelSink類型。不同類型的Source,ChannelSink可以自由組合。組合方式基於用戶設置的配置文件,非常靈活。

  比如:Channel可以把事件暫存在內存裏,也可以持久化到本地硬盤上。Sink可以把日誌寫入HDFS, HBase,甚至是另外一個Source等等。Flume支持用戶建立多級流,

  也就是說,多個agent可以協同工作,並且支持Fan-inFan-outContextual RoutingBackup Routes,這也正是Flume強大之處。如下圖所示:

  https://images2017.cnblogs.com/blog/999804/201711/999804-20171108132524544-1595248322.png

4.3Flume可靠性

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

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

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

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

五、Flume使用場景

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

5.1多個agent順序連接

  https://images2017.cnblogs.com/blog/999804/201711/999804-20171108161701747-2119139578.png

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

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

  https://images2017.cnblogs.com/blog/999804/201711/999804-20171108162907622-1214907870.png

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

5.3、多級流

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

  https://images2017.cnblogs.com/blog/999804/201711/999804-20171108163221169-1338466101.png

5.4load balance功能

  https://images2017.cnblogs.com/blog/999804/201711/999804-20171108163357028-1254679520.png

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

六、Flume核心組件

  Flume主要由3個重要的組件構成:
  1Source 完成對日誌數據的收集,分成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
  2Channel Flume Channel主要提供一個隊列的功能,對source提供中的數據進行簡單的緩存
     Flume對於Channel 則提供了Memory Channel JDBC Chanel File Channeletc

  3Sink Flume Sink取出Channel中的數據,進行相應的存儲文件系統,數據庫,或者提交到遠程服務器
    包括HDFS sink Logger sink Avro sink File Roll sink Null sink HBasesink etc

6.1Source

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

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

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

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

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

6.2Channel

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

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

6.3Sink

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

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

轉載於:https://www.cnblogs.com/zhangyinhua/p/7803486.html

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