![apache flume介紹](http://p2.ttnews.xyz/loading.gif)
1.flume 核心概念
l flume是一個分佈式、可靠、和高可用的海量日誌採集、聚合和傳輸的系統。支持在日誌系統中定製各類數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,並寫到各種數據接受方(比如文本、HDFS、Hbase等)的能力 。
l flume的數據流由事件(Event)貫穿始終。事件是Flume的基本數據單位,它攜帶日誌數據(字節數組形式)並且攜帶有頭信息,這些Event由Agent外部的Source生成,當Source捕獲事件後會進行特定的格式化,然後Source會把事件推入(單個或多個)Channel中。你可以把Channel看作是一個緩衝區,它將保存事件直到Sink處理完該事件。Sink負責持久化日誌或者把事件推向另一個Source。
1.1、Agent
使用JVM 運行Flume。每臺機器運行一個agent,但是可以在一個agent中包含多個sources和sinks。
1.2、Client
生產數據,運行在一個獨立的線程。
1.3、Source
從Client收集數據,傳遞給Channel。可以接收外部源發送過來的數據。不同的 source,可以接受不同的數據格式。比如有目錄池(spooling directory)數據源,可以監控指定文件夾中的新文件變化,如果目錄中有文件產生,就會立刻讀取其內容。
1.4、Sink
從Channel收集數據,運行在一個獨立線程,然後送給外部源或者其他source。如數據可以寫入到HDFS或者HBase中。
1.5、Channel
連接 sources 和 sinks ,這個有點像一個隊列,是一個存儲地,接收source的輸出,直到有sink消費掉channel中的數據。Channel中的數據直到進入到下一個channel中或者進入終端才會被刪除。當sink寫入失敗後,可以自動重啟,不會造成數據丟失,因此很可靠。
1.6、Events
可以是日誌記錄、 avro 對象等,Flume傳輸的數據的基本單位是event,如果是文本文件,通常是一行記錄,這也是事務的基本單位。
2、Flume節點組成
Flume只有一種角色的節點:代理節點(agent)。
Flume以agent為最小的獨立運行單位。單agent由Source、Sink和Channel三大組件構成。
Flume提供了大量內置的Source、Channel和Sink類型。不同類型的Source、Channel和Sink可以自由組合。組合方式基於用戶設置的配置文件,非常靈活。比如:Channel可以把事件暫存在內存裡,也可以持久化到本地硬盤上。Sink可以把日誌寫入HDFS, HBase,甚至是另外一個Source等等。
Flume支持用戶建立多級流,也就是說,多個agent可以協同工作,並且支持Fan-in、Fan-out、Contextual Routing、Backup Routes。如下圖:
Flume 允許多個 agent 連在一起,形成前後相連的多級跳。如下圖:
3、Source、Sink和Channel三大組件
3.1、Source組件
Flume 支持 Avro,log4j,syslog 和 http post(body為json格式)。可以讓應用程序同已有的Source直接打交道,如AvroSource,SyslogTcpSource。也可以 寫一個 Source,以 IPC 或RPC 的方式接入自己的應用,Avro和 Thrift 都可以(分別有NettyAvroRpcClient 和 ThriftRpcClient 實現了 RpcClient接口),其中 Avro 是默認的 RPC 協議。對現有程序改動最小的使用方式是使用是直接讀取程序原來記錄的日誌文件,基本可以實現無縫接入,不需要對現有程序進行任何改動。對於直接讀取文件 Source,有兩種方式:
ExecSource: 以運行 Linux 命令的方式,持續的輸出最新的數據,如tail -F 文件名 指令,在這種方式下,取的文件名必須是指定的。ExecSource 可以實現對日誌的實時收集,但是存在Flume不運行或者指令執行出錯時,將無法收集到日誌數據,無法保證日誌數據的完整性。
SpoolSource: 監測配置的目錄下新增的文件,並將文件中的數據讀取出來。需要注意兩點:拷貝到 spool 目錄下的文件不可以再打開編輯;spool目錄下不可包含相應的子目錄。SpoolSource 雖然無法實現實時的收集數據,但是可以使用以分鐘的方式分割文件,趨近於實時。如果應用無法實現以分鐘切割日誌文件的話,可以兩種收集方式結合使用。在實際使用的過程中,可以結合 log4j 使用,使用 log4j的時候,將 log4j 的文件分割機制設為1分鐘一次,將文件拷貝到spool的監控目錄。log4j 有一個 TimeRolling 的插件,可以把 log4j 分割文件到 spool 目錄。基本實現了實時的監控。Flume 在傳完文件之後,將會修改文件的後綴,變為 .COMPLETED(後綴也可以在配置文件中靈活指定)
Flume Source:
Source類型
說明
Avro Source
支持Avro協議(實際上是Avro RPC),內置支持
Thrift Source
支持Thrift協議,內置支持
Exec Source
基於Unix的command在標準輸出上生產數據
JMS Source
從JMS系統(消息、主題)中讀取數據,ActiveMQ已經測試過
Spooling Directory Source
監控指定目錄內數據變更
Twitter 1% firehose Source
通過API持續下載Twitter數據,試驗性質
Netcat Source
監控某個端口,將流經端口的每一個文本行數據作為Event輸入
Sequence Generator Source
序列生成器數據源,生產序列數據
Syslog Sources
讀取syslog數據,產生Event,支持UDP和TCP兩種協議
HTTP Source
基於HTTP POST或GET方式的數據源,支持JSON、BLOB表示形式
Legacy Sources
兼容老的Flume OG中Source(0.9.x版本)
3.2、Channel組件
當前有幾個 channel 可供選擇,分別是 Memory Channel, JDBC Channel , File Channel,Psuedo Transaction Channel。比較常見的是前三種 channel。
l MemoryChannel 可以實現高速的吞吐,但是無法保證數據的完整性。
l FileChannel保證數據的完整性與一致性。在具體配置FileChannel時,建議FileChannel設置的目錄和程序日誌文件保存的目錄設成不同的磁盤,以便提高效率。
File Channel 是一個持久化的隧道(channel),它持久化所有的事件,並將其存儲到磁盤中。因此,即使 Java 虛擬機當掉,或者操作系統崩潰或重啟,再或者事件沒有在管道中成功地傳遞到下一個代理(agent),這一切都不會造成數據丟失。Memory Channel 是一個不穩定的隧道,其原因是由於它在內存中存儲所有事件。如果java 進程死掉,任何存儲在內存的事件將會丟失。另外,內存的空間收到 RAM大小的限制,而 File Channel 這方面是它的優勢,只要磁盤空間足夠,它就可以將所有事件數據存儲到磁盤上。
l Flume Channel
Channel類型
說明
Memory Channel
Event數據存儲在內存中 type = memory
JDBC Channel
Event數據存儲在持久化存儲中,當前Flume Channel內置支持,type=jdbc
File Channel
Event數據存儲在磁盤文件中 type=file
Spillable Memory Channel
Event數據存儲在內存中和磁盤上,當內存隊列滿了,會持久化到磁盤文件(當前試驗性的,不建議生產環境使用)
Pseudo Transaction Channel
測試用途
Custom Channel
自定義Channel實現
3.3、Sink組件
Sink在設置存儲數據時,可以向文件系統、數據庫、hadoop存數據,在日誌數據較少時,可以將數據存儲在文件系中,並且設定一定的時間間隔保存數據。在日誌數據較多時,可以將相應的日誌數據存儲到Hadoop中,便於日後進行相應的數據分析。
Flume Sink:
Sink類型
說明
HDFS Sink
數據寫入HDFS
Logger Sink
數據寫入日誌文件
Avro Sink
數據被轉換成Avro Event,然後發送到配置的RPC端口上
Thrift Sink
數據被轉換成Thrift Event,然後發送到配置的RPC端口上
IRC Sink
數據在IRC上進行回放
File Roll Sink
存儲數據到本地文件系統
Null Sink
丟棄到所有數據
HBase Sink
數據寫入HBase數據庫
Morphline Solr Sink
數據發送到Solr搜索服務器(集群)
ElasticSearch Sink
數據發送到Elastic Search搜索服務器(集群)
Kite Dataset Sink
寫數據到Kite Dataset,試驗性質的
Custom Sink
自定義Sink實現
閱讀更多 從大數據說起 的文章