1. 程式人生 > >Flume(日誌收集系統)簡介

Flume(日誌收集系統)簡介

一、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收集資料,執行在一個獨立執行緒)

2.1、Agent結構  

  Flume 執行的核心是 Agent。Flume以agent為最小的獨立執行單位。一個agent就是一個JVM。它是一個完整的資料收集工具,含有三個核心元件,分別是 source、 channel、 sink。通過這些元件, Event 可以從一個地方流向另一個地方,如下圖所示。

2.2、source

  Source是資料的收集端,負責將資料捕獲後進行特殊的格式化,將資料封裝到事件(event)裡,然後將事件推入Channel中。 Flume提供了很多內建的Source, 支援 Avro, log4j, syslog 和 http post(body為json格式)。可以讓應用程式同已有的Source直接打交道,如AvroSource,

SyslogTcpSource。 如果內建的Source無法滿足需要, Flume還支援自定義Source。

  source型別: 

2.3、Channel

  Channel是連線Source和Sink的元件,大家可以將它看做一個數據的緩衝區(資料佇列),它可以將事件暫存到記憶體中也可以持久化到本地磁碟上, 直到Sink處理完該事件。介紹兩個較為常用的Channel, MemoryChannel和FileChannel。

  Channel型別:

2.4、Sink

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

  Sink型別: 

三、Flume攔截器、資料流以及可靠性

3.1、Flume攔截器

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

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

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

3.3、Flume可靠性

  Flume 使用事務性的方式保證傳送Event整個過程的可靠性。 Sink 必須在Event 被存入 Channel 後,或者,已經被傳達到下一站agent裡,又或者,已經被存入外部資料目的地之後,才能把 Event 從 Channel 中 remove 掉。這樣資料流裡的 event 無論是在一個 agent 裡還是多個 agent 之間流轉,都能保證可靠,因為以上的事務保證了 event 會被成功儲存起來。比如 Flume支援在本地儲存一份檔案 channel 作為備份,而memory channel 將event存在記憶體 queue 裡,速度快,但丟失的話無法恢復。

四、Flume使用場景

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

4.1、多個agent順序連線

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

4.2、多個Agent的資料匯聚到同一個Agent 

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

4.3、多級流

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