Flume不會丟失數據,根據Flume的架構原理,其內部有完善的事務機制,Source到Channel是事務性的,Channel到Sink也是事務性的,所以這兩個環節不會出現數據的丟失;
惟一可能丟失數據的狀況是Channel採用memoryChannel,agent宕機致使數據丟失,或者Channel存儲數據已滿,致使Source再也不寫入,未寫入的數據丟失。web
可是有可能形成數據的重複,例如數據已經成功由Sink發出,可是沒有接收到響應,Sink會再次發送數據,此時可能會致使數據的重複。數據庫
採集層主要可使用 Flume、Kafka 兩種技術。數組
Flume:Flume 是管道流方式,提供了不少的默認實現,讓用戶經過參數部署,及擴展 API。緩存
Kafka:Kafka 是一個可持久化的分佈式的消息隊列。安全
Kafka 是一個很是通用的系統。你能夠有許多生產者和不少的消費者共享多個主題Topics。相比之下,Flume 是一個專用工具被設計爲旨在往 HDFS,HBase 發送數據。它對HDFS 有特殊的優化,而且集成了 Hadoop 的安全特性。因此,Cloudera 建議若是數據被多個系統消費的話,使用 kafka;
若是數據被設計給 Hadoop 使用,使用 Flume。正如大家所知 Flume 內置不少的 source 和 sink 組件。然而,Kafka 明顯有一個更小的生產消費者生態系統,而且 Kafka 的社區支持很差。但願未來這種狀況會獲得改善,可是目前:使用 Kafka 意味着你準備好了編寫你本身的生產者和消費者代碼。若是已經存在的 Flume Sources 和 Sinks 知足你的需求,而且你更喜歡不須要任何開發的系統,請使用 Flume。Flume 可使用攔截器實時處理數據。這些對數據屏蔽或者過量是頗有用的。Kafka 須要外部的流處理系統才能作到。服務器
Kafka 和 Flume 都是可靠的系統,經過適當的配置能保證零數據丟失。然而,Flume 不支持副本事件。因而,若是 Flume 代理的一個節點奔潰了,即便使用了可靠的文件管道方式,你也將丟失這些事件直到你恢復這些磁盤。若是你須要一個高可靠行的管道,那麼使用Kafka 是個更好的選擇。架構
Flume 和 Kafka 能夠很好地結合起來使用。若是你的設計須要從 Kafka 到 Hadoop 的流數據,使用 Flume 代理並配置 Kafka 的 Source 讀取數據也是可行的:你沒有必要實現本身的消費者。你能夠直接利用Flume 與HDFS 及HBase 的結合的全部好處。你可使用ClouderaManager 對消費者的監控,而且你甚至能夠添加攔截器進行一些流處理。分佈式
使用官方提供的 flumeKafka 插件,插件的實現方式是自定義了 flume 的 sink,將數據從channle 中取出,經過 kafka 的producer 寫入到 kafka 中,能夠自定義分區等。工具
1)Flume 的 channel 分爲不少種,能夠將數據寫入到文件。oop
2)防止非首個 agent 宕機的方法數能夠作集羣或者主備
Flume 採集日誌是經過流的方式直接將日誌收集到存儲層,而 kafka 是將緩存在 kafka集羣,待後期能夠採集到存儲層。
Flume 採集中間停了,能夠採用文件的方式記錄以前的日誌,而 kafka 是採用 offset 的方式記錄以前的日誌。
1)source:用於採集數據,Source 是產生數據流的地方,同時 Source 會將產生的數據
流傳輸到 Channel,這個有點相似於 Java IO 部分的 Channel。
2)channel:用於橋接 Sources 和 Sinks,相似於一個隊列。
3)sink:從 Channel 收集數據,將數據寫到目標源(能夠是下一個 Source,也能夠是 HDFS
或者 HBase)。
它是數據流的基本單元,由一個裝載數據的字節數組(byte payload)和一系列可選的字符串屬性來組成(可選頭部).
Flume source 消耗從相似於 web 服務器這樣的外部源傳來的 events.
Flume source 組件能夠處理各類類型、各類格式的日誌數據,包括 avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy.
Flume channel
Channel 是鏈接Source和Sink的組件, 是位於 Source 和 Sink 之間的數據緩衝區。
Flume channel 使用被動存儲機制. 它存儲的數據的寫入是靠 Flume source 來完成的, 數據的讀取是靠後面的組件 Flume sink 來完成的.
Channel 是線程安全的,能夠同時處理幾個 Source 的寫入操做和幾個 Sink 的讀取操做。
Flume 自帶兩種 Channel:
Memory Channel是內存中的隊列。
Memory Channel在不須要關心數據丟失的情景下適用。
若是須要關心數據丟失,那麼Memory Channel就不該該使用,由於程序死亡、機器宕機或者重啓都會致使數據丟失。
File Channel。
File Channel將全部事件寫到磁盤。所以在程序關閉或機器宕機的狀況下不會丟失數據。
還能夠有其餘的 channel: 好比 JDBC channel.
Sink 不斷地輪詢 Channel 中的事件且批量地移除它們,並將這些事件批量寫入到存儲或索引系統、或者發送到另外一個Flume Agent。
Sink 是徹底事務性的。
在從 Channel 批量刪除數據以前,每一個 Sink 用 Channel 啓動一個事務。批量事件一旦成功寫出到存儲系統或下一個Flume Agent,Sink 就利用 Channel 提交事務。事務一旦被提交,該 Channel 從本身的內部緩衝區刪除事件。若是寫入失敗,將緩衝區takeList中的數據歸還給Channel。
Sink組件目的地包括hdfs、logger、avro、thrift、ipc、file、null、HBase、solr、自定義。
Flume的事務機制(相似數據庫的事務機制):Flume使用兩個獨立的事務分別負責從Soucrce到Channel,以及從Channel到Sink的事件傳遞。好比spooling directory source 爲文件的每一行建立一個事件,一旦事務中全部的事件所有傳遞到Channel且提交成功,那麼Soucrce就將該文件標記爲完成。同理,事務以相似的方式處理從Channel到Sink的傳遞過程,若是由於某種緣由使得事件沒法記錄,那麼事務將會回滾。且全部的事件都會保持到Channel中,等待從新傳遞。