Flume 介紹

ArthurGragg 8年前發布 | 33K 次閱讀 Flume 日志處理

Flume OG

Flume OG:Flume Original Generation,初代Flume。

由三種角色構成:代理點(agent)、收集節點(collector)、主節點(master)

  • agent 從各個數據源收集日志數據,將收集到的數據集中到 collector,然后由收集節點匯總存入 hdfs。
  • master 負責管理 agent,collector 的活動。
  • agent、collector 都稱為 node,node 的角色根據配置的不同分為 logical node(邏輯節點)、physical node(物理節點)。對 logical nodes 和 physical nodes 的區分、配置、使用一直以來都是使用者最頭疼的地方。
  • agent、collector由Source、Sink組成,當前節點的數據是從Source傳送到Sink的。

  • flume-og-01.png

    Flume NG

    Flume NG:Flume New Generation
  • NG只有一種角色節點:代理點(agent)。
  • 沒有collector、master節點。這是核心組件最核心的變化。
  • 去除了 physical nodes、logical nodes 的概念和相關內容。
  • agent 節點的組成也發生了變化。NG agent 由 source、sink、channel 組成。
  • NG刪減了角色,脫離了對Zookeeper的依賴

    flume-ng.png

    Flume NG分析

    基本概念

  • Event:一個數據單元,帶有一個可選的消息頭。
  • Flow:Event從源點到達目的點的遷移的抽象。
  • Client:操作位于源點處的Event,將其發送到Flume Agent。
  • Agent:一個獨立的Flume進程,包含組件Source、Channel、Sink。
  • Source:用來消費傳遞到該組件的Event ,存入channel中。
  • Channel:中轉Event的一個臨時存儲,保存有Source組件傳遞過來的Event。
  • Sink:從Channel中讀取并移除Event,將Event傳遞到Flow Pipeline中的下一個Agent(如果有的話)。

    數據流:

    Flume 的核心是把數據從數據源收集過來,再送到目的地。為了保證輸送一定成功,在送到目的地之前,會先緩存數據,待數據真正到達目的地后,刪除自己緩存的數據:當sink寫入失敗后,可以自動重啟,不會造成數據丟失,因此很可靠。
    Flume 傳輸的數據的基本單位是 Event,如果是文本文件,通常是一行記錄,這也是事務的基本單位。Event 從 Source,流向 Channel,再到 Sink,本身為一個 byte 數組,并可攜帶 headers 信息。Event 代表著一個數據流的最小完整單元,從外部數據源來,向外部的目的地去。

    核心組件:

    Source

  • ExecSource: 以運行 Linux 命令的方式,持續的輸出最新的數據,如 tail -F 文件名 指令,在這種方式下,取的文件名必須是指定的。 ExecSource 可以實現對日志的實時收集,但是存在Flume不運行或者指令執行出錯時,將無法收集到日志數據,無法保證日志數據的完整性。
  • SpoolSource: 監測配置的目錄下新增的文件,并將文件中的數據讀取出來。需要注意兩點:拷貝到 spool 目錄下的文件不可以再打開編輯;spool 目錄下不可包含相應的子目錄。SpoolSource無法實現實時的收集數據,但可以設置以分鐘的方式分割文件,趨于實時。

    Channel

    Memory Channel, JDBC Channel , File Channel,Psuedo Transaction Channel。比較常見的是前三種 channel。
  • MemoryChannel 可以實現高速的吞吐,但是無法保證數據的完整性。
  • MemoryRecoverChannel 在官方文檔的建議上已經建義使用FileChannel來替換。
  • FileChannel保證數據的完整性與一致性。在具體配置FileChannel時,建議FileChannel設置的目錄和程序日志文件保存的目錄設成不同的磁盤,以便提高效率。

    flume-channel.png

    Sink

    flume-sink.png

    可靠性

    在Flume NG中,可靠性指的是在數據流的傳輸過程中,保證events的可靠傳遞。
    在Flume NG中,所有的events都保存在Agent的Channel中,然后被發送到數據流下一個Agent或者最終的存儲服務中。當且僅當它們被保存到下一個Agent的Channel中,或者被保存到最終的存儲服務中。這就是Flume 提供數據流中點到點的可靠性保證的最基本的單跳消息語義傳遞。
    首先,Agent間的事務交換。Flume使用事務的辦法來保證events的可靠傳遞。Source和Sink分別被封裝在事務中,這些事務由保存event的存儲提供或者由Channel提供。這就保證了event在數據流的點對點傳輸中是可靠的。在多級數據流中,如下圖,上一級的Sink和下一級的Source都被包含在事務中,保證數據可靠地從一個Channel到另一個Channel轉移。

flume-transaction.png

下圖A:正常情況下的 events流程。
下圖B:Agent2 跟central event store失聯,Agent2提交的事務失敗,將events緩存起來。
下圖C:重新恢復時,再恢復失聯之前的任務以及后續的events發送。


flume-trans-example.png

高可用

如下圖所示,Agent1中,只有要有一個Sink組件可用,events就被傳遞到下一個組件,如果一個Sink能成功處理Event(事務完成),則會加入到一個Pool中, 否則,則會從Pool中移除,并計算失敗次數,設置懲罰因子。所以,如果某一個Flow中某一層的Agent只有一個,或者全部宕機,可能導致這些Events被存儲在流水線上最后一個存活節點。

flume-available.png

 

來自:http://www.jianshu.com/p/5fbf57980b87

 

 本文由用戶 ArthurGragg 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!