--- title: Apache Flume introduction tags: Apache, Flume description: Apache Flume introduction --- # Apache Flume introduction Flume 是由 Couldera 開發出高可用、高可靠的分散式日誌收集系統,flume 和 hadoop、Hbase、Hive 等等具有高相融性,但是其缺少了 replicas 的機制,缺少保護資料的機制,因此在使用上常常會與 kafka 一起使用,因此企業典型用一般用法是: 數據 -> flume -> kafka -> hdfs -> 離線處理 數據 -> flume -> kafka -> storm ## Flume Architecture Flume 是由 agent 為組成單位,一個 agent 由 Source、Channel、Sink 三個組件組成;一台機器只會有一個 agent 但一個 agent 可以同時存在很多的 Source、Channel、Sink。 Flume 的運行方式為從 Source 獲取數據源,之後資料流向 channel 進行緩存,等到資料輸出到 sink 時,即完成一個 cycle 刪除緩存資料,在 Flume 當中 Event 是數據傳輸的基本單位,Event 從 Source 流向 Channel 再流向 Sink,sink 再將數據寫入目的地。 ![](https://i.imgur.com/09LsLwA.png) ### Agent Agent是一個JVM進程,它以事件的形式將數據從源頭送至目的地。Agent主要有三個部分組成:Source、Channel、Sink。 ### Event Flume數據傳輸的基本單元,帶有一個可選的消息頭。如果是文本文件,通常是一行記錄。Event從Source,流向Channel,再到Sink,Sink將數據寫入目的地。 ### Source Source是負責接收數據到Flume Agent的組件。Source組件可以處理各種類型、各種格式的日誌數據,包括Avro Source、Exce Source、Spooling Directory Source、NetCat Source、Syslog Sources、Thrift Source、Sequence Generator Source、HTTP Source、Kafka Source等。 ### Channel Channel主要提供一個隊列的功能,是位於Source和Sink之間的緩衝區。Source到Channel是完全事務性的,一旦事務中的所有事件全部傳遞到Channel且提交成功,那麼Source就將其標記為完成。如果因為某種原因事件傳遞失敗,那麼事務將會回滾。 Flume對於Channel,則提供了Memory Channel、File Channel、JDBC Channel、Kafka Channel以及自定義Channel等。 Memory Channel是內存中的隊列。Memory Channel在不需要關心數據丟失的情境下適用。如果需要關心數據丟失,那麼就不應該使用Memory Channel。因為程序死亡或機器宕機都會導致數據丟失。 File Channel將所有事件寫到磁碟。因此在程序關閉或機器宕機的情況下不會丟失數據。 ### Sink Sink不斷地輪詢Channel中的事件且批量地移除它們,並將這些事件批量寫入到存儲或索引系統、或者被發送到另一個Flume Agent。 Channel到Sink是完全事務性的。在從Channel批量刪除數據之前,每個Sink用Channel啟動一個事務,批量事件一旦成功寫出到存儲系統或下一個Flume Agent,Sink就利用Channel提交事務。事務一旦被提交,該Channel從自己的內部緩衝區刪除事件。 Flume Sink包括HDFS Sink、Logger Sink、Avro Sink、Thrift Sink、File Roll Sink、Null Sink、Hive Sink、HBase Sink、Elasticsearch Sink、Kafka Sink以及自定義Sink。 ## Flume支持事務,分為Put事務與Take事務 ### Put事務: 從Source到Channel的事件傳輸過程叫Put事務。通過doPut將批數據先寫入臨時緩衝區putList;再通過doCommit將批數據提交給Channel,會檢查channel內存隊列是否足夠合併,如果Channel內存隊列空間不足,則rollback數據。 ### Take事務: 從Channel拉取事件數據到Sink的過程叫Take事務。通過doTake先將數據取到臨時緩衝區takeList;再通過doCommit將事件數據發送到Sink。如果數據全部發送數據成功,則清除臨時緩衝區takeList。如果數據發送過程中出現異常,rollback將臨時緩衝區takeList中的數據歸還給channel內存序列。 --- ## 參考 * https://kknews.cc/code/ejxrjnn.html ## Thank you! :dash: You can find me on - GitHub: https://github.com/shaung08 - Email: a2369875@gmail.com