文章目錄
1.定義
Flume(水道 )是Cloudera提供的一個高可用的,高可靠的,分佈式的海量日誌採集、聚合和傳輸的系統。Flume基於流式架構,靈活簡單。
最主要的作用是實時讀取服務器本地數據到HDFS
組成架構
組件
Agent
Agent是一個JVM進程,它以事件的形式將數據從源頭送至目的,是Flume數據傳輸的基本單元。
Agent主要有3個部分組成,Source、Channel、Sink。
Source:接受各種數據
Source是負責接收數據到Flume Agent的組件。Source組件可以處理各種類型、各種格式的日誌數據,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy。
可以輕量處理數據,如攔截。
用的最多的就是日誌文件
exec、tailDir、spoolDir監控文件的區別
- exec是在執行 tailDir命令,監控單個文件,但不能保證數據不丟失;
- Spooldir Source 能夠保證數據不丟失,且能夠實現斷點續傳,但延遲較高,不能實時監控;
- Taildir Source 既能夠實現斷點續傳,又可以保證數據不丟失,還能夠進行實時監控。
Channel:緩衝區
Channel是位於Source和Sink之間的緩衝區。因此,Channel允許Source和Sink運作在不同的速率上。Channel是線程安全的,可以同時處理幾個Source的寫入操作和幾個Sink的讀取操作。
Flume自帶兩種Channel:Memory Channel和File Channel。
- Memory Channel是內存中的隊列。Memory Channel在不需要關心數據丟失的情景下適用。如果需要關心數據丟失,那麼Memory Channel就不應該使用,因爲程序死亡、機器宕機或者重啓都會導致數據丟失。
- File Channel將所有事件寫到磁盤。因此在程序關閉或機器宕機的情況下不會丟失數據。
channel selector
-
replicating:複製
發送的每個channel
-
multiplexing:多路複用
選擇發送
Sink
Sink不斷地輪詢Channel中的事件且批量地移除它們,並將這些事件批量寫入到存儲或索引系統、或者被髮送到另一個Flume Agent。
Sink是完全事務性的。在從Channel批量刪除數據之前,每個Sink用Channel啓動一個事務。批量事件一旦成功寫出到存儲系統或下一個Flume Agent,Sink就利用Channel提交事務。事務一旦被提交,該Channel從自己的內部緩衝區刪除事件。
Sink組件目的地包括hdfs、logger、avro、thrift、ipc、file、null、HBase、solr、自定義。其中hdfs和kafka最常用
Event
傳輸單元,Flume數據傳輸的基本單元,以事件的形式將數據從源頭送至目的地。讀取日誌的時候一次讀一行
Header:事件的一些屬性,key-value
Body:存放該條數據,形式爲字節數組
innode
Linux 中儲存文件元數據的區域就叫做 inode,每個 inode 都有一個號碼,操作系統 用 inode 號碼來識別不同的文件,Unix/Linux 系統內部不使用文件名,而使用 inode 號碼來識別文件
內部原理
sink處理器有三種
- defaultProfessor(單個sink)
- LoadBalancingProfessor(負載均衡,用的最多)
- FailOverProfessor(故障轉移)
自定義攔截器
實際應用
將不同日誌發送到不同文件目錄下
拓撲結構
-
簡單串聯
將數據連接起來了,但是影響速率和有單點故障
-
多路複用
配置多個channel和sink,發送到不同目的地
-
負載均衡和故障轉移
Flume 支持使用將多個 sink 邏輯上分到一個 sink 組,sink 組配合不同的 SinkProcessor 可以實現負載均衡和錯誤恢復的功能。
-
聚合
最符合實際應用場景,將多臺服務器的日誌數據採集,並彙總到hdfs、hive等進行處理
自定義
flume可自定義source、sink、interceptpr