您好,登錄后才能下訂單哦!
這篇文章主要講解了“Apache Flume是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“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是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。