共計 2500 個字符,預計需要花費 7 分鐘才能閱讀完成。
這篇文章主要講解了“Apache Flume 是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學習“Apache Flume 是什么”吧!
Flume 是為高效收集聚合大量日志數據設計的可靠的、可用的分布式系統。它有一個基于流式數據流的簡單靈活的體系。它提供了可控的可靠機制和許多故障轉移與恢復機制。它使用了一個用于在線分析應用的簡單可擴展的數據模型。
FileChannel 是一個持久化的 Flume channel,支持并行的寫到多個磁盤并且支持加密。
概念
當使用 Flume 時,每個流程都有一個 Source、Channel、Sink。一個典型的例子是一個 webserver 通過 RPC(比如:AvroSource)將 events 寫到一個 Source、然后 Source 將 events 寫到 MemoryChannel,最后 HDFSSink 消費 event,將它寫到 HDFS。
MemoryChannel 能提供很高的吞吐量,但是當系統斷電或程序崩潰時會丟失數據。因此人們急需一個能持久化的 Channel。FileChannel 在 FLUME-1085 被實現。它的目標是提供一個可靠的高吞吐量的 Channel。FileChannel 保證當斷電或崩潰發生時,事務被提交,沒有數據丟失。
重要的一點是 FileChannel 不做任何數據的復制,僅依賴于底層磁盤的可靠性,因此,由于持久性需要使用 FileChannel 的用戶在購買和配置硬件時注意這一點。底層的磁盤將要做 RAID、SAN 或類似的東西。
許多系統為了高的吞吐率需要拿允許小量數據丟失做交換。Flume 組決定 FileChannel 采用不同的方式。Flume 是一個支持事務的系統,多個 event 可以在單個事務中被 put 或 take。batch size 用來控制吞吐率。使用大的 batch size,flume 可以以高吞吐率移動數據,并且不丟失數據。batch size 完全可以通過 client 控制。這個方法與 DBMS
相似。
一個 flume 事務包含 put 或 take,一個事務中不能同時有 put 和 take 操作。每個事務都要實現 put 和 take 方法。source 通過 put 將 event 放入 channel,sink 通過 take 將 event 從 channel 拿走。
設計
FileChannel 是基于內存隊列和 WAL 設計的。每次事務都是根據事物類型(Take 和 Put)寫到 WAL,隊列也做相應的修改。每次事務被 commited,都會調用 fsync 確保 events 被存儲在磁盤文件,同時指向該 event 的指針被放到隊列中。這里的隊列服務就像其他隊列一樣:它管理著什么被 sink 消費。在 Take 期間,該 event 的指針從隊列被刪除。直接從 WAL 讀這個 event。由于今天我們有大量可用的 RAM,從操作系統的文件緩存中讀取也是經常發生的。
崩潰后,通過重放 WALs,隊列位置能恢復到崩潰前同樣的狀態,而那些沒有 commited 的事務被丟棄。重放 WALs 相當耗時,因此隊列本身會周期性的寫到磁盤。將隊列寫到磁盤稱為 checkpoint。這樣,崩潰后,隊列首先從磁盤 checkpoint 文件加載,然后僅僅重放那些隊列被最后一次 checkpoint 到磁盤后 commited 的事務,這樣明顯的減少了讀取 WAL 的數量。
例如,一個 channel 有 2 個 event,如下所示:
WALs 包含 3 個重要的屬性:事務 ID、序列號、event 數據。每個事務都有唯一的事務 Id,并且每個 event 都有唯一的序列號。事務 Id 被用來簡單的將 event 分組到同一事務,而序列號在重放 log 時使用。上圖中,事務 ID 為 1,序列號為 1,2,3.
當隊列被 checkpoint 到磁盤,增加序列號,同時序列號也被保存到磁盤。重啟時,隊列首先從磁盤加載,然后比隊列序列號大的任何 WAL 實體被重放。checkpoin 操作期間,隊列是 locked,以至于沒有 Put 或 Take 操作可以更改它的狀態。如果 checkpoint 期間允許隊列的修改,將導致磁盤存儲的隊列快照與實際隊列不一致。
在上面例子中,事務 1commited 后,checkpoint 發生,在隊列中的結果帶著 events 被保存到磁盤還有序列號 4 也被保存。
之后,在事務 2 中,從隊列 take 一個 event:
如果這個時候崩潰了,重啟時隊列從 checkpoint 加載,注意,checkpoint 發生在事務 2 前,2 個 event“a”和“b”都會被加載到隊列,之后任何比 4 大的已經確認的事務被重放,重放后,“a”event 從隊列被刪除。 上面的設計 2 點沒有考慮到,Take 或 Put 進行中,同時發生 checkpoint,會導致數據丟失。假定 checkpoint 發生在 take“a”之后:
如果此時崩潰,在以上描述的設計下,event“b”被加載進入隊列,之后重放比 5 大的任何 WAL 實體,事務 2 被 rollback,但是這里的 take“a”不會被重放。event“a”被丟失,Put 也存在相似的情況。由于這個原因,當隊列的 checkpoint 發生時,仍然在處理中的事務也被寫出,以至于可以適當的處理這個問題。
實現
FileChannel 在 Flume 項目的 flume-file-channel 模塊,對應包名為 org.apache.flume.channel.file。上面描述的隊列對應
FlumeEventQueue 類,WAL 對應
Log 類。隊列本身是一個環形數組,通過內存映射文件支撐;而 WAL 對應一組文件,可以使用
LogFile 類和它的子類讀寫這些文件。
感謝各位的閱讀,以上就是“Apache Flume 是什么”的內容了,經過本文的學習后,相信大家對 Apache Flume 是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關知識點的文章,歡迎關注!