1.Flume
是Cloudera提供的一個(gè)高可用的,高可靠的,分布式的海量日志采集、聚合和傳輸?shù)南到y(tǒng),F(xiàn)lume支持在日志系統(tǒng)中定制各類(lèi)數(shù)據(jù)發(fā)送方,用于收集數(shù)據(jù);同時(shí),F(xiàn)lume提供對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)單處理,并寫(xiě)到各種數(shù)據(jù)接受方(可定制)的能力;
2.Flume設(shè)計(jì)目標(biāo):
---》可靠性:當(dāng)節(jié)點(diǎn)出現(xiàn)故障時(shí),日志能夠被傳送到其他節(jié)點(diǎn)上而不會(huì)丟失。Flume提供了三種級(jí)別的可靠性保障,從強(qiáng)到弱依次分別為:end-to-end(Exactly once),Store on failure(當(dāng)數(shù)據(jù)接收方crash時(shí),將數(shù)據(jù)寫(xiě)到本地,待恢復(fù)后,繼續(xù)發(fā)送),Best effort(數(shù)據(jù)發(fā)送到接收方后,不會(huì)進(jìn)行確認(rèn))
---》可擴(kuò)展性:Flume采用了三層架構(gòu),分別為Source,Channel和Sink,每一層均可以水平擴(kuò)展
---》可管理性:所有Source, Channel和 Sink 由 Agent 統(tǒng)一管理,這使得系統(tǒng)便于維護(hù)

3.各組件職責(zé):
--》Source 組件:負(fù)責(zé)日志流入,比如從文件、網(wǎng)絡(luò)、Kafka 等數(shù)據(jù)源流入數(shù)據(jù),數(shù)據(jù)流入的方式有兩種:輪訓(xùn)拉取和事件驅(qū)動(dòng);
--》Channel 組件:負(fù)責(zé)數(shù)據(jù)聚合/暫存,比如暫存到內(nèi)存、本地文件、數(shù)據(jù)庫(kù)、Kafka 等,日志數(shù)據(jù)不會(huì)在管道停留很長(zhǎng)時(shí)間,很快會(huì)被 Sink 消費(fèi)掉;
--》Sink 組件:負(fù)責(zé)數(shù)據(jù)轉(zhuǎn)移存儲(chǔ),比如從 Channel 拿到日志后直接存儲(chǔ)到 HDFS、HBase、Kafka、ElasticSearch 等。
一個(gè)Agent會(huì)同時(shí)存在這三個(gè)組件,Source和Sink都是異步執(zhí)行的,相互之間不會(huì)影響

4.整體結(jié)構(gòu),可以靈活配置
Source 上的數(shù)據(jù)可以復(fù)制到不同的通道上。每一個(gè) Channel 也可以連接不同數(shù)量的 Sink。這樣連接不同配置的 Agent 就可以組成一個(gè)復(fù)雜的數(shù)據(jù)收集網(wǎng)絡(luò)。


(1)Flume Source組件
Source 組件負(fù)責(zé)接收輸入數(shù)據(jù),并將數(shù)據(jù)寫(xiě)入管道 (Channel)。Flume的Source支持:
Avro
Exec
HTTP
Spooling Directory
Kafka
Syslog
……
其中Spooling支持監(jiān)視一個(gè)目錄或者文件,解析其中新生成的事件
(2)Flume 過(guò)濾器(攔截器):
在 App(應(yīng)用程序日志)和 Source 之間的,對(duì) App 日志進(jìn)行攔截處理的。官方已有的攔截器有(可以鏈?zhǔn)教砑佣鄠€(gè)):
--》Timestamp Interceptor: 在 event 的 header 中添加一個(gè) key 為 timestamp , value為當(dāng)前的時(shí)間戳;
--》Host Interceptor: 在 event 的 header 中添加一個(gè) key 為 host , value 為當(dāng)前機(jī)器的 hostname 或者 ip;
--》Static Interceptor:可以在 event 的 header 中添加自定義的 key 和 value;
--》Regex Filtering Interceptor: 通過(guò)正則來(lái)清洗或包含匹配的 events;
--》Regex Extractor Interceptor: 通過(guò)正則表達(dá)式來(lái)在 header 中添加指定的key , value則為正則匹配的部分
(3)Flume Channel組件
Channel組件存儲(chǔ),緩存從 Source 到 Sink 的中間數(shù)據(jù)??墒褂貌煌呐渲脕?lái)做Channel,例如:
內(nèi)存
文件
JDBC
Kafka
……
其中使用內(nèi)存性能高但不持久,有可能丟數(shù)據(jù)。使用文件更可靠,但性能不如內(nèi)存
Flume Channel 選擇器:
數(shù)據(jù)通過(guò)不同的 Channel 路由到不同的 Sink 中。官方已有的 Channel 選擇器有:
--》Replicating Channel Selector (default): 將 Source過(guò)來(lái)的 events 發(fā)往所有Channel;
--》Multiplexing Channel Selector: 可以選擇將數(shù)據(jù)發(fā)往哪些 Channel;
(4)Flume Sink組件
Sink 組件負(fù)責(zé)從管道中讀出數(shù)據(jù)并發(fā)給下一個(gè) Agent 或者最終的目的地。Sink 支持的不同目的地種類(lèi)包括:
HDFS
HBASE
Avro
ElasticSearch
File
Logger
其它的 Flume Agent
Flume 序列化器:
在 Sink 和目標(biāo)存儲(chǔ)之間自定義數(shù)據(jù)序列化方式。官方已有的序列化器有:
--》Body Text Serializer: 忽略 event header,只將 event value 寫(xiě)到輸出流;
--》Avro Event Serializer: 數(shù)據(jù)以 Avro 序列化,然后寫(xiě)到輸出流;
Flume Sink 處理器:
在多個(gè) Sink 之間選擇下一個(gè)用來(lái)發(fā)送數(shù)據(jù)的 Sink 。官方已有的 Sink 處理器有:
--》Failover Sink Processor: 每次都從活動(dòng)池選擇優(yōu)先級(jí)最高的 Sink 發(fā)送數(shù)據(jù),當(dāng)發(fā)送失敗時(shí)放入冷卻池直到超過(guò)冷凍期,一旦重新發(fā)送成功就重新進(jìn)入活動(dòng)池;
--》Load balancing Sink Processor : 每次都按照配置的方案從多個(gè) Sink 中選擇一個(gè) Sink 發(fā)送數(shù)據(jù)。目前官方提供兩種策略: round_robin, random ;