Flume簡介html
Flume 是一個cloudera提供的 高可用高可靠,分佈式的海量日誌收集聚合傳輸系統。原名是 Flume OG (original generation),但隨着 FLume 功能的擴展,Flume OG 代碼工程臃腫、核心組件設計不合理、核心配置不標準等缺點暴露出來,尤爲是在 Flume OG 的最後一個發行版本 0.94.0 中,日誌傳輸不穩定的現象尤其嚴重,爲了解決這些問題,2011 年 10 月 22 號,cloudera 完成了 Flume-728,對 Flume 進行了里程碑式的改動:重構核心組件、核心配置以及代碼架構,重構後的版本統稱爲 Flume NG(next generation,改動的另外一緣由是將 Flume 歸入 apache 旗下,cloudera Flume 更名爲 Apache Flume)。apache
FLUME NG架構
一、NG 只有一種角色的節點:代理節點(agent)。負載均衡
二、agent 節點的組成也發生了變化。Flume NG 的 agent 由 source、sink、Channel 組成。jvm
flume ng 節點組成圖:分佈式
多 Agent 並聯下的架構圖:ide
Flume 的特性測試
flume 支持在日誌系統中定製各種數據發送方,用於收集數據;同時支持對數據進行簡單處理,並寫到各類數據接受方(好比文本、HDFS、Hbase等)的能力 。ui
flume 的數據流由事件(Event)貫穿始終。事件是 Flume 的基本數據單位,它攜帶日誌數據而且攜帶有頭信息,這些 Event 由 Agent 外部的 Source 生成,當 Source 捕獲事件後會進行特定的格式化,而後 Source 會把事件推入(單個或多個) Channel 中。能夠把 Channel 看做是一個緩衝區,它將保存事件直到 Sink 處理完該事件。線程
Sink 負責持久化日誌或者把事件推向另外一個 Source。
Flume 具有高可靠性
當節點出現故障時,日誌可以被傳送到其餘節點上而不會丟失。Flume提供了三種級別的可靠性保障,從強到弱依次分別爲:
一、end-to-end:收到數據agent首先將event寫到磁盤上,當數據傳送成功後,再刪除;若是數據發送失敗,能夠從新發送。
二、Store on failure:這也是scribe採用的策略,當數據接收方crash崩潰時,將數據寫到本地,待恢復後,繼續發送。
三、Best effort:數據發送到接收方後,不會進行確認。
Flume 架構組成和核心概念
# client: 生產數據的地方,運行在一個獨立的線程。
# event: 生產的數據,能夠是日誌記錄、 avro 對象等,若是是文本文件一般是一行記錄。
# agent: flume 核心組件,flume 以 Agent 爲最小的獨立運行單位。一個 agent 就是一個 jvm, agent 又是由 source, channel, sink 等構建而成。
agent 由 source, channel, sink 等構建而成:
3.1 Source:從 Client 收集數據,傳遞給 Channel
不一樣的 source,能夠接受不一樣的數據格式,好比監視外部源–目錄池(spooling directory)數據源,能夠監控指定文件夾中的新文件變化,若是目錄中有文件產生,就會馬上讀取其內容。source 組件能夠處理各類格式的日誌數據,eg:avro Sources、thrift Sources、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy、自定義。
Avro Source:支持Avro協議(其實是Avro RPC),內置支持|
Thrift Source:支持Thrift協議,內置支持
Exec Source:基於Unix的command在標準輸出上生產數據
JMS Source:從JMS系統(消息、主題)中讀取數據
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版本)
詳細參考官網:http://flume.apache.org/FlumeUserGuide.html#flume-sources
3.二、Channel:鏈接 sources 和 sinks
有點像一個隊列,是一個存儲池,接收 source 的輸出,直到有 sink 消費掉 channel 中的數據,channel 中的數據直到進入下一個 channel 或者進入 sink 纔會被刪除,當 sink 寫入失敗後,能夠自動重啓,不會形成數據丟失。臨時存放的數據能夠存放在memory Channel、jdbc Channel、file Channel、自定義。
Memory Channel:Event數據存儲在內存中
JDBC Channel:Event數據存儲在持久化存儲中,當前Flume Channel內置支持Derby
File Channel:Event數據存儲在磁盤文件中
Spillable Memory Channel:Event數據存儲在內存中和磁盤上,當內存隊列滿了,會持久化到磁盤文件
Pseudo Transaction Channel:測試用途
Custom Channel:自定義Channel實現
詳情參考官網:http://flume.apache.org/FlumeUserGuide.html#flume-channels
3.三、Sink:從Channel收集數據,運行在一個獨立線程
用於把數據發送到目的地的組件目的地包括 hdfs、logger、avro、thrift、ipc、file、null、hbase、solr、自定義。
詳細參考官網:http://flume.apache.org/FlumeUserGuide.html#flume-sinks
flume能夠支持
一、多級 flume的 agent,(即多個 flume 能夠連成串,上一個 flume 能夠把數據寫到下一個 flume 上)
二、支持扇入(fan-in):source 能夠接受多個輸入
三、扇出(fan-out):sink 能夠輸出到多個目的地
3.四、其餘幾個組件
Interceptor:做用於Source,按照預設的順序在必要地方裝飾和過濾events。
Channel Selector:容許Source基於預設的標準,從全部Channel中,選擇一個或多個Channel
Sink Processor:多個Sink能夠構成一個Sink Group。Sink Processor能夠經過組中全部Sink實現負載均衡;也能夠在一個Sink失敗時轉移到另外一個。