一、介紹
Flume是一個高可用、高可靠,分布式的海量日志采集、聚合和傳輸的系統。Flume支持在日志系統中定制各類數據發送方,用于收集數據;同時,Flume提供對數據進行簡單處理,并寫到各種數據接受方(可定制)的能力。其中Flume-NG是Flume的一個分支,其目的是要明顯簡單,體積更小,更容易部署,其最基本的架構如下圖所示:
Flume-NG由一個個Agent來組成,而每個Agent由Source、Channel、Sink三個模塊組成,其中Source負責接收數據,Channel負責數據的傳輸,Sink則負責數據向下一端的發送。
二、模塊說明
名稱 | 說明 |
---|---|
Source | Source負責接收數據或通過特殊機制產生數據,并將數據批量放到一個或多個Channel。Source的類型有數據驅動和輪詢兩種。典型的Source類型如下:1.和系統集成的Sources:Syslog、Netcat。2.自動生成事件的Sources:Exec、SEQ。3.用于Agent和Agent之間通信的IPC Sources:Avro。4.Source必須至少和一個Channel關聯。 |
Channel | Channel位于Source和Sink之間,用于緩存來自Source的數據,當Sink成功將數據發送到下一跳的Channel或最終目的地時,數據從Channel移除。Channel提供的持久化水平與Channel的類型相關,有以下三類:1.Memory Channel:非持久化。2.File Channel:基于WAL(預寫式日志Write-Ahead Logging)的持久化實現。3.JDBC Channel:基于嵌入Database的持久化實現。Channel支持事務,可提供較弱的順序保證,可以和任何數量的Source和Sink工作。 |
Sink | Sink負責將數據傳輸到下一跳或最終目的,成功完成后將數據從Channel移除。典型的Sink類型如下:1.存儲數據到最終目的終端Sink,比如:HDFS、HBase。2.自動消耗的Sink,比如:Null Sink。3.用于Agent間通信的IPC sink:Avro。Sink必須作用于一個確切的Channel。 |
Flume也可以配置成多個Source、Channel、Sink,如下圖所示:
Flume的可靠性基于Agent間事務的交換,下一個Agent down掉,Channel可以持久化數據,Agent恢復后再傳輸。Flume的可用性則基于內建的Load Balancing和Failover機制。Channel及Agent都可以配多個實體,實體之間可以使用負載分擔等策略。每個Agent為一個JVM進程,同一臺服務器可以有多個Agent。收集節點(Agent1,2,3)負責處理日志,匯聚節點(Agent4)負責寫入HDFS,每個收集節點的Agent可以選擇多個匯聚節點,這樣可以實現負載均衡。
Flume的架構和詳細原理介紹,請參見:https://flume.apache.org/releases/1.9.0.html。
三、Flume原理
Agent之間的可靠性
Agent之間數據交換流程如下圖所示。
-
Flume采用基于Transactions的方式保證數據傳輸的可靠性,當數據從一個Agent流向另外一個Agent時,兩個Transactions已經開始生效。發送Agent的Sink首先從Channel取出一條消息,并且將該消息發送給另外一個Agent。如果接受消息的Agent成功地接受并處理消息,那么發送Agent將會提交Transactions,標識一次數據傳輸成功可靠地完成。
-
當接收Agent接受到發送Agent發送的消息時,開始一個新的Transactions,當該數據被成功處理(寫入Channel中),那么接收Agent提交該Transactions,并向發送Agent發送成功響應。
-
如果在某次提交(commit)之前,數據傳輸出現了失敗,將會再次開始上一次Transactions,并將上次發送失敗的數據重新傳輸。因為commit操作已經將Transactions寫入了磁盤,那么在進程故障退出并恢復業務之后,仍然可以繼續上次的Transactions。
四、Flume與HDFS的關系
當用戶配置HDFS作為Flume的Sink時,HDFS就作為Flume的最終數據存儲系統,Flume將傳輸的數據全部按照配置寫入HDFS中。
五、Flume與HBase的關系
當用戶配置HBase作為Flume的Sink時,HBase就作為Flume的最終數據存儲系統,Flume將傳輸的數據全部按照配置寫入HBase中。