一、flume簡介
Flume是Cloudera提供的日誌收集系統,Flume支持在日誌系統中定製各類數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,並寫到各種storage。Flume是一個分佈式、可靠、和高可用的海量日誌採集、聚合和傳輸的系統。
上圖的Flume的Architecture,在Flume中,最重要的抽象是data flow(數據流),data flow描述了數據從產生,傳輸、處理並最終寫入目標的一條路徑。在上圖中,實線描述了data flow。
其中,Agent用於採集數據,agent是flume中產生數據流的地方,同時,agent會將產生的數據流傳輸到collector。對應的,collector用於對數據進行聚合,往往會產生一個更大的流。
Flume提供了從console(控制檯)、RPC(Thrift-RPC)、text(文件)、tail(UNIX tail)、syslog(syslog日誌系統,支持TCP和UDP等2種模式),exec(命令執行)等數據源上收集數據的能力。同時,Flume的數據接受方,可以是console(控制檯)、text(文件)、dfs(HDFS文件)、RPC(Thrift-RPC)和syslogTCP(TCPsyslog日誌系統)等。
其中,收集數據有2種主要工作模式,如下:
Push Sources:外部系統會主動地將數據推送到Flume中,如RPC、syslog。
Polling Sources:Flume到外部系統中獲取數據,一般使用輪詢的方式,如text和exec。
注意,在Flume中,agent和collector對應,而source和sink對應。Source和sink強調發送、接受方的特性(如數據格式、編碼等),而agent和collector關注功能。
Flume Master用於管理數據流的配置,如下圖。
爲了保證可擴展性,Flume採用了多Master的方式。爲了保證配置數據的一致性,Flume引入了ZooKeeper,用於保存配置數據,ZooKeeper本身可保證配置數據的一致性和高可用,另外,在配置數據發生變化時,ZooKeeper可以通知Flume Master節點。
Flume Master間使用gossip協議同步數據。
下面簡要分析Flume如何支持Reliability、Scalability、Manageability和Extensibility。
Reliability:Flume提供3中數據可靠性選項,包括End-to-end、Store on failure和Best effort。其中End-to-end使用了磁盤日誌和接受端Ack的方式,保證Flume接受到的數據會最終到達目的。Store on failure在目的不可用的時候,數據會保持在本地硬盤。和End-to-end不同的是,如果是進程出現問題,Store on failure可能會丟失部分數據。Best effort不做任何QoS保證。
Scalability:Flume的3大組件:collector、master和storage tier都是可伸縮的。需要注意的是,Flume中對事件的處理不需要帶狀態,它的Scalability可以很容易實現。
Manageability:Flume利用ZooKeeper和gossip,保證配置數據的一致性、高可用。同時,多Master,保證Master可以管理大量的節點。
Extensibility:基於Java,用戶可以爲Flume添加各種新的功能,如通過繼承Source,用戶可以實現自己的數據接入方式,實現Sink的子類,用戶可以將數據寫往特定目標,同時,通過SinkDecorator,用戶可以對數據進行一定的預處理。
注:以上介紹來自:http://caibinbupt.iteye.com/blog/765960,更多瞭解請參考Flume主頁:https://github.com/cloudera/flume/
二、爲什麼選擇flume
目前可選的開源日誌收集項目有如下這些:facebook的scribe,apache的chukwa,linkedin的kafka和cloudera的flume,注:flume正逐步遷移到apache下。其他項目的介紹課參考各項目主頁:
scribe主頁:https://github.com/facebook/scribe
chukwa主頁:http://incubator.apache.org/chukwa/
kafka主頁:http://sna-projects.com/kafka/
在此參考網友繪製的對比圖表:
(圖表來自:http://dongxicheng.org/search-engine/log-systems/)
從上圖中可以看出flume作爲開源的日誌收集項目比較優秀,使用廣泛,參考資料比較多。整體設計架構提供了強大的可擴展性和豐富的自帶插件。
FLUME日誌收集
一、FLUME介紹
Flume是一個分佈式、可靠、和高可用的海量日誌聚合的系統,支持在系統中定製各類數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,並寫到各種數據接受方(可定製)的能力。
設計目標:
(1) 可靠性
當節點出現故障時,日誌能夠被傳送到其他節點上而不會丟失。Flume提供了三種級別的可靠性保障,從強到弱依次分別爲:end-to-end(收到數據agent首先將event寫到磁盤上,當數據傳送成功後,再刪除;如果數據發送失敗,可以重新發送。),Storeon failure(這也是scribe採用的策略,當數據接收方crash時,將數據寫到本地,待恢復後,繼續發送),Besteffort(數據發送到接收方後,不會進行確認)。
(2) 可擴展性
Flume採用了三層架構,分別爲agent,collector和storage,每一層均可以水平擴展。其中,所有agent和collector由master統一管理,這使得系統容易監控和維護,且master允許有多個(使用ZooKeeper進行管理和負載均衡),這就避免了單點故障問題。
(3) 可管理性
所有agent和colletor由master統一管理,這使得系統便於維護。多master情況,Flume利用ZooKeeper和gossip,保證動態配置數據的一致性。用戶可以在master上查看各個數據源或者數據流執行情況,且可以對各個數據源配置和動態加載。Flume提供了web 和shellscript command兩種形式對數據流進行管理。
(4) 功能可擴展性
用戶可以根據需要添加自己的agent,collector或者storage。此外,Flume自帶了很多組件,包括各種agent(file, syslog等),collector和storage(file,HDFS等)。
二、FLUME架構
flume的邏輯架構:、
正如前面提到的,Flume採用了分層架構:分別爲agent,collector和storage。其中,agent和collector均由兩部分組成:source和sink,source是數據來源,sink是數據去向。
Flume使用兩個組件:Master和Node,Node根據在Mastershell或web中動態配置,決定其是作爲Agent還是Collector。
(1)agent
agent的作用是將數據源的數據發送給collector。
Flume自帶了很多直接可用的數據源(source),如:
· text(“filename”):將文件filename作爲數據源,按行發送
· tail(“filename”):探測filename新產生的數據,按行發送出去
· fsyslogTcp(5140):監聽TCP的5140端口,並且接收到的數據發送出去
· tailDir("dirname"[,fileregex=".*"[, startFromEnd=false[, recurseDepth=0]]]):監聽目錄中的文件末尾,使用正則去選定需要監聽的文件(不包含目錄),recurseDepth爲遞歸監聽其下子目錄的深度
更多可參見這位朋友的整理:http://www.cnblogs.com/zhangmiao-chp/archive/2011/05/18/2050465.html
同時提供了很多sink,如:
· console[("format")] :直接將將數據顯示在consolr上
· text(“txtfile”):將數據寫到文件txtfile中
· dfs(“dfsfile”):將數據寫到HDFS上的dfsfile文件中
· syslogTcp(“host”,port):將數據通過TCP傳遞給host節點
· agentSink[("machine"[,port])]:等價於agentE2ESink,如果省略,machine參數,默認使用flume.collector.event.host與flume.collector.event.port作爲默認collecotr
· agentDFOSink[("machine"[,port])]:本地熱備agent,agent發現collector節點故障後,不斷檢查collector的存活狀態以便重新發送event,在此間產生的數據將緩存到本地磁盤中
· agentBESink[("machine"[,port])]:不負責的agent,如果collector故障,將不做任何處理,它發送的數據也將被直接丟棄
· agentE2EChain:指定多個collector提高可用性。當向主collector發送event失效後,轉向第二個collector發送,當所有的collector失敗後,它會非常執着的再來一遍
更多可參見這位朋友的整理:http://www.cnblogs.com/zhangmiao-chp/archive/2011/05/18/2050472.html
(2)collector
collector的作用是將多個agent的數據彙總後,加載到storage中。
它的source和sink與agent類似。
數據源(source),如:
· collectorSource[(port)]:Collector source,監聽端口匯聚數據
· autoCollectorSource:通過master協調物理節點自動匯聚數據
· logicalSource:邏輯source,由master分配端口並監聽rpcSink
sink,如:
· collectorSink("fsdir","fsfileprefix",rollmillis):collectorSink,數據通過collector匯聚之後發送到hdfs, fsdir 是hdfs目錄,fsfileprefix爲文件前綴碼
· customdfs("hdfspath"[,"format"]):自定義格式dfs
(3) storage
storage是存儲系統,可以是一個普通file,也可以是HDFS,HIVE,HBase,分佈式存儲等。
(4) Master
Master是管理協調agent和collector的配置等信息,是flume集羣的控制器。
在Flume中,最重要的抽象是data flow(數據流),dataflow描述了數據從產生,傳輸、處理並最終寫入目標的一條路徑。
1. 對於agent數據流配置就是從哪得到數據,把數據發送到哪個collector。
2. 對於collector是接收agent發過來的數據,把數據發送到指定的目標機器上。
注:Flume框架對hadoop和zookeeper的依賴只是在jar包上,並不要求flume啓動時必須將hadoop和zookeeper服務也啓動。
其他配置以及相關資料,可參見博客:
http://blog.csdn.net/wulantian/article/details/46341135