Flume定義
Flume是Cloudera提供的一個高可用的,高可靠的,分佈式的海量日誌採集、聚合和傳輸的系統。Flume基於流式架構,靈活簡單
Flume的優點
- 可以和任意存儲進程集成。
- 輸入的的數據速率大於寫入目的存儲的速率,flume會進行緩衝,減小hdfs的壓力。
- flume中的事務基於channel,使用了兩個事務模型(sender + receiver),確保消息被可靠發送。
Flume使用兩個獨立的事務分別負責從soucrce到channel,以及從channel到sink的事件傳遞。一旦事務中所有的數據全部成功提交到channel,那麼source才認爲該數據讀取完成。同理,只有成功被sink寫出去的數據,纔會從channel中移除。
Flume組成架構
- Source數據輸入端的常見類型有:spooling directory、 exec 、syslog、 avro、netcat等。
- Channel是位於Source和Sink之間的緩衝區。
Flume自帶兩種Channel:Memory Channel和File Channel。
Memory Channel是基於內存緩存,在不需要關心數據丟失的情景下適用。
File Channel是Flume的持久化Channel。系統宕機不會丟失數據。 - Sink組件常見的目的地包括HDFS、Kafka、logger、avro、File、自定義。
- Put事務流程
doPut:將批數據先寫入臨時緩衝區putList
doCommit:檢查channel內存隊列是否足夠合併。
doRollback:channel內存隊列空間不足,回滾數據 - Take事務
doTake:先將數據取到臨時緩衝區takeList
doCommit:如果數據全部發送成功,則清除臨時緩衝區takeList
doRollback:數據發送過程中如果出現異常,rollback將臨時緩衝區takeList中的數據歸還給channel內存隊列。
Agent
Agent是一個JVM進程,它以事件的形式將數據從源頭送至目的。
Agent主要有3個部分組成,Source、Channel、Sink
Source
Source是負責接收數據到Flume Agent的組件。Source組件可以處理各種類型、各種格式的日誌數據,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy。
Channel
Channel是位於Source和Sink之間的緩衝區。因此,Channel允許Source和Sink運作在不同的速率上。Channel是線程安全的,可以同時處理幾個Source的寫入操作和幾個Sink的讀取操作。
Flume自帶兩種Channel:Memory Channel和File Channel。
Memory Channel是內存中的隊列。Memory Channel在不需要關心數據丟失的情景下適用。如果需要關心數據丟失,那麼Memory Channel就不應該使用,因爲程序死亡、機器宕機或者重啓都會導致數據丟失。
File Channel將所有事件寫到磁盤。因此在程序關閉或機器宕機的情況下不會丟失數據。
Sink
Sink不斷地輪詢Channel中的事件且批量地移除它們,並將這些事件批量寫入到存儲或索引系統、或者被髮送到另一個Flume Agent。
Sink是完全事務性的。在從Channel批量刪除數據之前,每個Sink用Channel啓動一個事務。批量事件一旦成功寫出到存儲系統或下一個Flume Agent,Sink就利用Channel提交事務。事務一旦被提交,該Channel從自己的內部緩衝區刪除事件。
Sink組件目的地包括hdfs、logger、avro、thrift、ipc、file、null、HBase、solr、自定義。
Event
傳輸單元,Flume數據傳輸的基本單元,以事件的形式將數據從源頭送至目的地。 Event由可選的header和載有數據的一個byte array 構成。Header是容納了key-value字符串對的HashMap。
Flume拓撲結構
這種模式是將多個flume給順序連接起來了,從最初的source開始到最終sink傳送的目的存儲系統。此模式不建議橋接過多的flume數量, flume數量過多不僅會影響傳輸速率,而且一旦傳輸過程中某個節點flume宕機,會影響整個傳輸系統。
Flume支持將事件流向一個或者多個目的地。這種模式將數據源複製到多個channel中,每個channel都有相同的數據,sink可以選擇傳送的不同的目的地
Flume支持使用將多個sink邏輯上分到一個sink組,flume將數據發送到不同的sink,主要解決負載均衡和故障轉移問題
這種模式是我們最常見的,也非常實用,日常web應用通常分佈在上百個服務器,大者甚至上千個、上萬個服務器。產生的日誌,處理起來也非常麻煩。用flume的這種組合方式能很好的解決這一問題,每臺服務器部署一個flume採集日誌,傳送到一個集中收集日誌的flume,再由此flume上傳到hdfs、hive、hbase、jms等,進行日誌分析
Flume Agent內部原理
Flume安裝地址
- Flume官網地址
http://flume.apache.org/ - 文檔查看地址
http://flume.apache.org/FlumeUserGuide.html - 下載地址
http://archive.apache.org/dist/flume/
安裝部署
- 將apache-flume-1.7.0-bin.tar.gz上傳到linux的/opt/software目錄下
- 解壓apache-flume-1.7.0-bin.tar.gz到/opt/module/目錄下
[liujh@hadoop102 software]$ tar -zxf apache-flume-1.7.0-bin.tar.gz -C /opt/module/
- 修改apache-flume-1.7.0-bin的名稱爲flume
[liujh@hadoop102 module]$ mv apache-flume-1.7.0-bin flume
- 將flume/conf下的flume-env.sh.template文件修改爲flume-env.sh,並配置flume-env.sh文件
[liujh@hadoop102 conf]$ mv flume-env.sh.template flume-env.sh
[liujh@hadoop102 conf]$ vi flume-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
簡書:https://www.jianshu.com/u/0278602aea1d
CSDN:https://blog.csdn.net/u012387141