Flume是一個分佈式的、高可用的海量日誌採集系統。它支持對日誌數據的發送方、接收方進行定義,可將多種來源的日誌數據寫到指定的接收方,如:文本、HDFS、Hbase等。
我認爲Flume最讓我稱讚的就是,能夠在不干涉已有系統運行的狀況下,無侵入地對採集到該系統的日誌信息。java
Flume的數據流由event(事件)貫穿始終,event是Flume的基本數據單位,它攜帶日誌數據(字節數組形式)和頭信息,這些event由Agent外部的Source生成。 當Source捕獲到事先設定的事件(這裏的事件,是指廣義上的事件), 就會生成event並推送到單個或多個Channel中。你能夠把Channel看做是一個緩衝區,它保存event直到Sink對其處理完畢。Sink負責處理event,它對日誌進行持久化或把event 轉給另外一個Source。數組
Flume以agent爲最小的獨立運行單位,每臺機器運行一個agent,一個agent由Source、Sink和Channel三大組件構成,以下圖:app
一個agent中包含多個sources和sinks:tcp
sources.type = netcat
Flume能夠監聽到某臺計算機(Client)接收到其它計算機發來的netcat、telnet消息, 而後將這些消息傳送到指定的地方,如hdfs、HBase、Kafka等。詳細用法,參考http://corejava2008.iteye.com/blog/2218123分佈式
sources.type = exec
Flume能夠監聽到某臺計算機(Client)某個指令的執行,而後把指令執行產生的輸出信息發送到指定的地方,如hdfs、HBase、Kafka。如設定:
sources.command = tail -F /app/xxx.log
那麼每當有10條新的日誌產生後,Flume就把這10條新日誌傳送到指定的地方,如hdfs、HBase、Kafka等。.net
sources.type = spooldir
Flume能夠監聽到某臺計算機(Client)上某個目錄文件的變化,當有新的日誌文件產生時,Flume就把這個日誌文件的內容傳送到指定的地方,如hdfs、HBase、Kafka等。線程
sources.type = http
詳細用法,參考http://my.oschina.net/pengqiang/blog/537380?p={{page}}日誌
sources.type = syslogtcp
Flume能夠監聽到某臺計算機(Client)TCP的端口,把從端口接收到的消息傳送到指定的地方,如hdfs、HBase、Kafka等。詳細用法,參考http://www.jb51.net/article/53542.htmhtm