flume介紹html
flume是一個分佈式、可靠、和高可用的海量日誌採集、聚合和傳輸的系統。支持在日誌系統中定製各種數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,並寫到各類數據接受方(好比文本、HDFS、Hbase等)的能力 。官方網站:http://flume.apache.org/java
flume架構web
Flume採用了分層架構:分別爲agent,collector和storage。用戶能夠根據須要添加本身的的agent,collector或者storage。其中,agent和collector均有兩部分組成:source和sink,source是數據來源,sink是數據去向。(大三層和小三層同樣,也能夠說flume分爲source、channel和sink)數據庫
Flume核心概念apache
大的方面:json
Agent使用JVM 運行Flume。每臺機器運行一個agent,可是能夠在一個agent中包含多個sources和sinks。Collector將多個agent的數據收集後加載到storage中。架構
Storage存儲收集的數據。分佈式
Client生產數據,運行在一個獨立的線程。ide
小的方面:oop
Source從Client收集數據,傳遞給Channel。Flume組件詳解
Source從Client收集數據,傳遞給Channel。
Client端操做消費數據的來源,Flume 支持 Avro,log4j,syslog 和 http post(body爲json格式)。可讓應用程序同已有的Source直接打交道,如AvroSource,SyslogTcpSource。也能夠 寫一個 Source,以 IPC 或 RPC 的方式接入本身的應用,Avro和 Thrift 均可以(分別有 NettyAvroRpcClient 和 ThriftRpcClient 實現了 RpcClient接口),其中 Avro 是默認的 RPC 協議。具體代碼級別的 Client 端數據接入,能夠參考官方手冊。
對現有程序改動最小的使用方式是使用是直接讀取程序原來記錄的日誌文件,基本能夠實現無縫接入,不須要對現有程序進行任何改動。
對於直接讀取文件 Source,有兩種方式:
ExecSource: 以運行 Linux 命令的方式,持續的輸出最新的數據,如tail -F 文件名指令,在這種方式下,取的文件名必須是指定的。 ExecSource 能夠實現對日誌的實時收集,可是存在Flume不運行或者指令執行出錯時,將沒法收集到日誌數據,沒法保證日誌數據的完整性。
SpoolSource: 監測配置的目錄下新增的文件,並將文件中的數據讀取出來。須要注意兩點:拷貝到 spool 目錄下的文件不能夠再打開編輯;spool 目錄下不可包含相應的子目錄。
SpoolSource 雖然沒法實現實時的收集數據,可是可使用以分鐘的方式分割文件,趨近於實時。
若是應用沒法實現以分鐘切割日誌文件的話, 能夠兩種收集方式結合使用。 在實際使用的過程當中,能夠結合 log4j 使用,使用 log4j的時候,將 log4j 的文件分割機制設爲1分鐘一次,將文件拷貝到spool的監控目錄。
log4j 有一個 TimeRolling 的插件,能夠把 log4j 分割文件到 spool 目錄。基本實現了實時的監控。Flume 在傳完文件以後,將會修改文件的後綴,變爲 .COMPLETED(後綴也能夠在配置文件中靈活指定)
Channel鏈接 sources 和 sinks ,這個有點像一個隊列
當前有幾個 channel 可供選擇,分別是 Memory Channel, JDBC Channel , File Channel,Psuedo Transaction Channel。比較常見的是前三種 channel。
MemoryChannel 能夠實現高速的吞吐,可是沒法保證數據的完整性。
MemoryRecoverChannel 在官方文檔的建議上已經建義使用FileChannel來替換。
FileChannel保證數據的完整性與一致性。在具體配置FileChannel時,建議FileChannel設置的目錄和程序日誌文件保存的目錄設成不一樣的磁盤,以便提升效率。
File Channel 是一個持久化的隧道(channel),它持久化全部的事件,並將其存儲到磁盤中。所以,即便 Java 虛擬機當掉,或者操做系統崩潰或重啓,再或者事件沒有在管道中成功地傳遞到下一個代理(agent),這一切都不會形成數據丟失。Memory Channel 是一個不穩定的隧道,其緣由是因爲它在內存中存儲全部事件。若是 java 進程死掉,任何存儲在內存的事件將會丟失。另外,內存的空間收到 RAM大小的限制,而 File Channel 這方面是它的優點,只要磁盤空間足夠,它就能夠將全部事件數據存儲到磁盤上。
Sink從Channel收集數據,運行在一個獨立線程。
Sink在設置存儲數據時,能夠向文件系統、數據庫、hadoop存數據,在日誌數據較少時,能夠將數據存儲在文件系中,而且設定必定的時間間隔保存數據。在日誌數據較多時,能夠將相應的日誌數據存儲到Hadoop中,便於往後進行相應的數據分析. collectorSink("fsdir","fsfileprefix",rollmillis):collectorSink,數據經過collector匯聚以後發送到hdfs, fsdir 是hdfs目錄,fsfileprefix爲文件前綴碼。