Flume架構原理詳解

一、概念理解

(1)Flume簡介

Apache Flume是一個分佈式,可靠且可用的系統,用於有效地收集,聚合大量日誌數據並將其從許多不同的源移動到集中式數據存儲中。Apache Flume的使用不僅限於日誌數據聚合。由於數據源是可定製的,因此Flume可用於傳輸大量事件數據,包括但不限於網絡流量數據,社交媒體生成的數據,電子郵件消息以及幾乎所有可能的數據源。Apache Flume是Apache Software Foundation的頂級項目。

(2)Flume特點

(1)可靠性

當節點出現故障時,日誌能夠被傳送到其他節點上而不會丟失。Flume提供了三種級別的可靠性保障,從強到弱依次分別爲:

  • end-to-end:收到數據agent首先將event寫到磁盤上,當數據傳送成功後,再刪除;如果數據發送失敗,可以重新發送
  • Store on failure:這也是scribe採用的策略,當數據接收方crash時,將數據寫到本地,待恢復後,繼續發送
  • Best effort:數據發送到接收方後,不會進行確認

(2)可恢復性

事件在通道中上演,該通道管理從故障中恢復。Flume支持持久的文件通道,該通道由本地文件系統支持。還有一個內存通道可以將事件簡單地存儲在內存隊列中,這樣速度更快,但是當代理進程死亡時,仍保留在內存通道中的任何事件都無法恢復。

(3)可擴展性

Flume採用了三層架構,分別爲agent,collector和storage,每一層均可以水平擴展。
其中,所有agent和collector由master統一管理,這使得系統容易監控和維護,且master允許有多個(使用ZooKeeper進行管理和負載均衡),這就避免了單點故障問題。

(4)可管理性

  • 所有agent和colletor由master統一管理,這使得系統便於維護。
  • 多master情況,Flume利用ZooKeeper和gossip,保證動態配置數據的一致性。
  • 用戶可以在master上查看各個數據源或者數據流執行情況,且可以對各個數據源配置和動態加載。
  • Flume提供了web 和shell script command兩種形式對數據流進行管理。

(5)功能可擴展性

  • 用戶可以根據需要添加自己的agent,collector或者storage。
  • Flume自帶了很多組件,包括各種agent(file, syslog等),collector和storage(file,HDFS等)。

二、Flume中核心架構組件

在這裏插入圖片描述
結合上圖,Flume的一些核心組件

  • Web Server:數據產生的源頭。
  • Agent:Flume的核心就是Agent 。Agent是一個Java進程,包含組件Source、 Channel、 Sink,且運行在日誌收集端,通過Agent接收日誌,然後暫存起來,再發送到目的地。(Agent使用JVM 運行Flume。每臺機器運行一個agent,但是可以在一個agent中包含多個sources和sinks。)
  • Source:Agent核心組件之一,Source(源)用於從Web Server收集數據,然後發送到Channel(通道)。
  • Channel:Agent核心組件之一,Channel(通道)可以用來從Source接收數據,然後發送到Sink,Channel存放臨時數據,有點類似隊列一樣。
  • Sink:Agent核心組件之一,Sink(接收器)用來把數據發送的目標地點,如上圖放到HDFS中。
  • Event:整個數據傳輸過程中,流動的對象都是實現了org.apache.flume.Event接口的對象。Event也是事務保證的級別。
  • Flow:Event從源點到達目的點的遷移的抽象

(1)Agent

Flume 運行的核心是 Agent。Flume以agent爲最小的獨立運行單位。一個agent就是一個JVM。它是一個完整的數據收集工具,含有三個核心組件,分別是source、 channel、 sink。通過這些組件, Event 可以從一個地方流向另一個地方。

(2)source

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

source類型:
在這裏插入圖片描述

(2)Channel

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

Channel類型:
在這裏插入圖片描述

(3)Sink

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

Sink類型:
在這裏插入圖片描述

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

(1)Flume攔截器

當我們需要對數據進行過濾時,除了我們在Source、 Channel和Sink進行代碼修改之外, Flume爲我們提供了攔截器,攔截器也是chain形式的。攔截器的位置在Source和Channel之間,當我們爲Source指定攔截器後,我們在攔截器中會得到event,根據需求我們可以對event進行保留還是拋棄,拋棄的數據不會進入Channel中。
在這裏插入圖片描述

(2)Flume數據流

  • Flume 的核心是把數據從數據源收集過來,再送到目的地。爲了保證輸送一定成功,在送到目的地之前,會先緩存數據,待數據真正到達目的地後,刪除自己緩存的數據。
  • 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)Flume可靠性

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

四、Flume使用場景

(1)多個agent順序連接

可以將多個Agent順序連接起來,將最初的數據源經過收集,存儲到最終的存儲系統中。這是最簡單的情況,一般情況下,應該控制這種順序連接的Agent 的數量,因爲數據流經的路徑變長了,如果不考慮failover的話,出現故障將影響整個Flow上的Agent收集服務。
在這裏插入圖片描述
這個例子裏面爲了能讓數據流在多個Agent之間傳輸,前一個Agent的sink必須和後一個Agent的source都需要設置爲avro類型並且指向相同的hostname(或者IP)和端口。

(2)多Agent的複雜流

這種情況應用的場景比較多,比如要收集Web網站的用戶行爲日誌, Web網站爲了可用性使用的負載集羣模式,每個節點都產生用戶行爲日誌,可以爲每個節點都配置一個Agent來單獨收集日誌數據,然後多個Agent將數據最終匯聚到一個用來存儲數據存儲系統,如HDFS上。
在這裏插入圖片描述
可以通過使用 Avro Sink 配置多個第一層 Agent(Agent1、Agent2、Agent3),所有第一層Agent的Sink都指向下一級同一個Agent(Agent4)的 Avro Source上(同樣你也可以使用 thrift 協議的 Source 和 Sink 來代替)。Agent4 上的 Source 將 Event 合併到一個 channel 中,該 channel中的Event最終由HDFS Sink 消費發送到最終目的地。

(3)多路複用流

Flume支持多路複用數據流到一個或多個目的地。這是通過使用一個流的[多路複用器](multiplexer )來實現的,它可以 複製 或者 選擇 數據流到一個或多個channel上。

很容易理解, 複製 就是每個channel的數據都是完全一樣的,每一個channel上都有完整的數據流集合。 選擇 就是通過自定義一個分配機制,把數據流拆分到多個channel上。
在這裏插入圖片描述
上圖的例子展示了從Agent foo扇出流到多個channel中。這種扇出的機制可以是複製或者選擇。當配置爲複製的時候,每個Event都被髮送到3個channel上。當配置爲選擇的時候,當Event的某個屬性與配置的值相匹配時會被髮送到對應的channel。

例如Event的屬性txnType是customer時,Event被髮送到channel1和channel3,如果txnType的值是vendor時,Event被髮送到channel2,其他值一律發送到channel3,這種規則是可以通過配置來實現的。

參考文章:


以上內容僅供參考學習,如有侵權請聯繫我刪除!
如果這篇文章對您有幫助,左下角的大拇指就是對博主最大的鼓勵。
您的鼓勵就是博主最大的動力!

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