Flume簡介
Flume是一個高可用、高可靠,分布式的海量日志采集、聚合和傳輸?shù)南到y(tǒng)。Flume支持在日志系統(tǒng)中定制各類數(shù)據(jù)發(fā)送方,用于收集數(shù)據(jù);同時,F(xiàn)lume提供對數(shù)據(jù)進(jìn)行簡單處理,并寫到各種數(shù)據(jù)接受方(可定制)的能力。其中Flume-NG是Flume的一個分支,其目的是要明顯簡單,體積更小,更容易部署。也可以配置成多個Source、Channel、Sink。
Flume-NG結(jié)構(gòu)
Flume-NG結(jié)構(gòu)
Flume-NG由一個個Agent來組成,而每個Agent由Source、Channel、Sink三個模塊組成,其中Source負(fù)責(zé)接收數(shù)據(jù),Channel負(fù)責(zé)數(shù)據(jù)的傳輸,Sink則負(fù)責(zé)數(shù)據(jù)向下一端的發(fā)送。
- Source
Source負(fù)責(zé)接收數(shù)據(jù)或通過特殊機(jī)制產(chǎn)生數(shù)據(jù),并將數(shù)據(jù)批量放到一個或多個Channel。主要有數(shù)據(jù)驅(qū)動和輪詢兩種,且必須至少和一個Channel關(guān)聯(lián),典型類型如下:
1、和系統(tǒng)集成的Sources:Syslog、Netcat。
2、自動生成事件的Sources:Exec、SEQ。
3、用于Agent和Agent之間通信的IPC Sources:Avro。
- Channel
Channel位于Source和Sink之間,用于緩存來自Source的數(shù)據(jù),當(dāng)Sink成功將數(shù)據(jù)發(fā)送到下一跳的Channel或最終目的地時,數(shù)據(jù)從Channel移除。Channel支持事務(wù),可提供較弱的順序保證,可以和任何數(shù)量的Source和Sink工作,其提供的持久化水平與Channel的類型相關(guān),有以下三類:
1、Memory Channel:非持久化。
2、File Channel:基于WAL(預(yù)寫式日志W(wǎng)rite-Ahead Logging)的持久化實現(xiàn)。
3、JDBC Channel:基于嵌入Database的持久化實現(xiàn)。
- Sink
Sink負(fù)責(zé)將數(shù)據(jù)傳輸?shù)较乱惶蜃罱K目的,成功完成后將數(shù)據(jù)從Channel移除。Sink必須作用于一個確切的Channel,典型類型如下:
1、存儲數(shù)據(jù)到最終目的終端Sink:HDFS、HBase。
2、自動消耗的Sink:Null Sink。
3、用于Agent間通信的IPC sink:Avro。

Flume可靠性
Flume Agent之間的可靠性
- Agent傳輸原理
1、Flume采用基于Transactions的方式保證數(shù)據(jù)傳輸?shù)目煽啃?,?dāng)數(shù)據(jù)從一個Agent流向另外一個Agent時,兩個Transactions已經(jīng)開始生效。發(fā)送Agent的Sink首先從Channel取出一條消息,并且將該消息發(fā)送給另外一個Agent。如果接受消息的Agent成功地接受并處理消息,那么發(fā)送Agent將會提交Transactions,標(biāo)識一次數(shù)據(jù)傳輸成功可靠地完成。
2、當(dāng)接收Agent接受到發(fā)送Agent發(fā)送的消息時,開始一個新的Transactions,當(dāng)該數(shù)據(jù)被成功處理(寫入Channel中),那么接收Agent提交該Transactions,并向發(fā)送Agent發(fā)送成功響應(yīng)。
3、如果在某次提交(commit)之前,數(shù)據(jù)傳輸出現(xiàn)了失敗,將會再次開始上一次Transactions,并將上次發(fā)送失敗的數(shù)據(jù)重新傳輸。因為commit操作已經(jīng)將Transactions寫入了磁盤,那么在進(jìn)程故障退出并恢復(fù)業(yè)務(wù)之后,仍然可以繼續(xù)上次的Transactions。
- Agent傳輸流程
Agent傳輸流程示意圖如左圖所示。

Flume與其他組件的關(guān)系
-
Flume與HDFS的關(guān)系
當(dāng)用戶配置HDFS作為Flume的Sink時,HDFS就作為Flume的最終數(shù)據(jù)存儲系統(tǒng),F(xiàn)lume將傳輸?shù)臄?shù)據(jù)全部按照配置寫入HDFS中。
當(dāng)用戶配置HDFS作為Flume的Sink時,HDFS就作為Flume的最終數(shù)據(jù)存儲系統(tǒng),F(xiàn)lume將傳輸?shù)臄?shù)據(jù)全部按照配置寫入HDFS中。
-
Flume與HBase的關(guān)系
當(dāng)用戶配置HBase作為Flume的Sink時,HBase就作為Flume的最終數(shù)據(jù)存儲系統(tǒng),F(xiàn)lume將傳輸?shù)臄?shù)據(jù)全部按照配置寫入HBase中。
當(dāng)用戶配置HBase作為Flume的Sink時,HBase就作為Flume的最終數(shù)據(jù)存儲系統(tǒng),F(xiàn)lume將傳輸?shù)臄?shù)據(jù)全部按照配置寫入HBase中。