標籤:
架構圖
資料流向圖
1.Flume 的一些核心概念:
2.資料流模型
Flume以agent為最小的獨立運行單位。一個agent就是一個JVM。單agent由Source、Sink和Channel三大組件構成,如:
Flume的資料流由事件(Event)貫穿始終。事件是Flume的基本資料單位,它攜帶日誌資料(位元組數組形式)並且攜帶有頭資訊,這些Event由Agent外部的Source,比如中的Web Server產生。當Source捕獲事件後會進行特定的格式化,然後Source會把事件推入(單個或多個)Channel中。你可以把Channel看作是一個緩衝區,它將儲存事件直到Sink處理完該事件。Sink負責持久化日誌或者把事件推向另一個Source。
很直白的設計,其中值得注意的是,Flume提供了大量內建的Source、Channel和Sink類型。不同類型的Source,Channel和Sink可以自由組合。組合方式基於使用者佈建的設定檔,非常靈活。比如:Channel可以把事件暫存在記憶體裡,也可以持久化到本地硬碟上。Sink可以把日誌寫入HDFS, HBase,甚至是另外一個Source等等。
如果你以為Flume就這些能耐那就大錯特錯了。Flume支援使用者建立多級流,也就是說,多個agent可以協同工作,並且支援Fan-in、Fan-out、Contextual Routing、Backup Routes。如所示:
3.高可靠性
作為生產環境啟動並執行軟體,高可靠性是必須的。從單agent來看,Flume使用基於事務的資料傳遞方式來保證事件傳遞的可靠性。Source和Sink被封裝進一個事務。事件被存放在Channel中直到該事件被處理,Channel中的事件才會被移除。這是Flume提供的點到點的可靠機制。從多級流來看,前一個agent的sink和後一個agent的source同樣有它們的事務來保障資料的可靠性
4.可恢複性
還是靠Channel。推薦使用FileChannel,事件持久化在本地檔案系統裡(效能較差)。
5.Flume 整體架構介紹
Flume架構整體上看就是 source-->channel-->sink 的三層架構(參見最上面的 圖一),類似產生者和消費者的架構,他們之間通過queue(channel)傳輸,解耦。
Source:完成對日誌資料的收集,分成 transtion 和 event 打入到channel之中。
Channel:主要提供一個隊列的功能,對source提供中的資料進行簡單的緩衝。
Sink:取出Channel中的資料,進行相應的隱藏檔系統,資料庫,或者提交到遠程伺服器。
對現有程式改動最小的使用方式是使用是直接讀取程式原來記錄的記錄檔,基本可以實現無縫接入,不需要對現有程式進行任何改動。
對於直接讀取檔案Source, 主要有兩種方式:
2.1 Exec source
可通過寫Unix command的方式組織資料,最常用的就是tail -F [file]。
可以實現即時傳輸,但在flume不運行和指令碼錯誤時,會丟資料,也不支援斷點續傳功能。因為沒有記錄上次檔案讀到的位置,從而沒辦法知道,下次再讀時,從什麼地方開始讀。特別是在記錄檔一直在增加的時候。flume的source掛了。等flume的source再次開啟的這段時間內,增加的日誌內容,就沒辦法被source讀取到了。不過flume有一個execStream的擴充,可以自己寫一個監控日誌增加情況,把增加的日誌,通過自己寫的工具把增加的內容,傳送給flume的node。再傳送給sink的node。要是能在tail類的source中能支援,在node掛掉這段時間的內容,等下次node開啟後在繼續傳送,那就更完美了。
2.2 Spooling Directory Source
SpoolSource:是監測配置的目錄下新增的檔案,並將檔案中的資料讀取出來,可實現准即時。需要注意兩點:1、拷貝到spool目錄下的檔案不可以再開啟編輯。2、spool目錄下不可包含相應的子目錄。在實際使用的過程中,可以結合log4j使用,使用log4j的時候,將log4j的檔案分割機制設為1分鐘一次,將檔案拷貝到spool的監控目錄。log4j有一個TimeRolling的外掛程式,可以把log4j分割的檔案到spool目錄。基本實現了即時的監控。Flume在傳完檔案之後,將會修改檔案的尾碼,變為.COMPLETED(尾碼也可以在設定檔中靈活指定)
ExecSource,SpoolSource對比:ExecSource可以實現對日誌的即時收集,但是存在Flume不運行或者指令執行出錯時,將無法收集到日誌資料,無法何證日誌資料的完整性。SpoolSource雖然無法實現即時的收集資料,但是可以使用以分鐘的方式分割檔案,趨近於即時。如果應用無法實現以分鐘切割記錄檔的話,可以兩種收集方式結合使用。
Channel有多種方式:有MemoryChannel, JDBC Channel, MemoryRecoverChannel, FileChannel。MemoryChannel可以實現高速的吞吐,但是無法保證資料的完整性。MemoryRecoverChannel在官方文檔的建議上已經建義使用FileChannel來替換。FileChannel保證資料的完整性與一致性。在具體配置FileChannel時,建議FileChannel設定的目錄和程式記錄檔儲存的目錄設成不同的磁碟,以便提高效率。
Sink在設定儲存資料時,可以向檔案系統中,資料庫中,hadoop中儲資料,在日誌資料較少時,可以將資料存放區在檔案系中,並且設定一定的時間間隔儲存資料。在日誌資料較多時,可以將相應的日誌資料存放區到Hadoop中,便於日後進行相應的資料分析。
利用flume+kafka+storm+mysql構建大資料即時系統