您好,登錄后才能下訂單哦!
這篇文章主要介紹“Apache的Flume和FileChannel有什么用”,在日常操作中,相信很多人在Apache的Flume和FileChannel有什么用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Apache的Flume和FileChannel有什么用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
Flume使用簡單可擴展的數據模型,支持在線分析應用程序。
FileChannel是支持并行加密寫入多個磁盤的持久化Flume channel.
當使用Flume 時,每個工作流都擁有Source, Channel, and Sink,典型例子是一個webserver通過RPC將事件(events)寫入Source(例如:Avro Source),sources又將events寫入MemoryChannel,同時HDFS Sink從MemoryChannel消費events,并寫入HDFS
MemoryChannel提供高吞吐的性能,同時在斷電和程序崩潰之后會造成數據丟失。因此需要開發一個持久化的Channel。File Channel的目標是提供一個可靠的高吞吐Channel。File Channel保證當事務被提交后,不會因為一系列程序崩潰或者掉電而造成數據丟失。
值得注意的是,FileChannel本身不會對數據進行任何復制。 因此,它只能與底層磁盤一樣可靠。 由于其耐用性而使用FileChannel的用戶在購買和配置硬件時應考慮到這一點。 底層磁盤應為RAID,SAN或類似磁盤。
許多系統以少量數據丟失風險換取更高的吞吐量(例如fsync,每隔幾秒從內存到磁盤)。 Flume團隊決定采用不同的方法實現FileChannel。 Flume是一個事務性系統,多個事件(events)可以是單個事務中實現或者put或者take的操作。 批量大小可用于控制吞吐量。 使用大的批處理容量,Flume可以通過流處理數據,在高吞吐量的情況下而不會丟失數據。 批量處理的大小完全可以由客戶端控制。 這對于RDBMS用戶比較熟悉。
Flume事務或者包含Puts 操作,或者Takes操作,不同時支持兩個操作,同時commit和rollback 也是如此。每個事物transanction都是了Put 和Take方法。Source 調用Put 方法將事件寫入Channel,Sinks執行Takes 方法從channel中取數據。
FileChannel除了基于內存隊列之外,還基于預寫日志WAL。每個事務都根據事務類型(Take或Put)寫入WAL,并相應地修改隊列。每次提交事務時,都會在相應的文件上調用fsync,以確保數據確實寫入磁盤上,并將指向該事件的指針放在隊列中。該隊列就像任何其他隊列一樣:它管理尚未被Sink消費的內容。在獲取期間,將隊列中指針刪除。然后直接從WAL讀取事件。由于目前可用的RAM量很大,因此從操作系統文件緩存中進行讀取非常常見。
程序崩潰后,可以重放WAL以將隊列置于崩潰之前的狀態,因此已提交的事務不會丟失。重放WAL可能非常耗時,因此隊列本身會定期寫入磁盤。將隊列寫入磁盤稱為檢查點。崩潰后,隊列從磁盤加載,然后只有隊列保存到磁盤后才提交事務,這大大減少了必須讀取的WAL數量。
例如,channel中有兩個如下圖所示的events。
WAL包含三個重要項:事務ID,序列號和事件數據。 每個事務都有一個唯一的事務ID,每個事件都有一個唯一的序列號。 事務id僅用于將事件分組到事務中,而在重放日志時使用序列號。 在上面的示例中,事務id為1,序列號為1,2和3。
當隊列保存到磁盤(檢查點)時,序列號也會增加并保存。 在重新啟動時,首先加載來自磁盤的隊列,然后重放序列號大于隊列的所有WAL條目。 在檢查點操作期間,通道被鎖定,因此任何Put或Take操作都不能改變它的狀態。 允許在檢查點期間修改隊列將導致存儲在磁盤上的隊列的快照不一致。
在上面的示例隊列中,在提交事務1之后發生檢查點,導致隊列中的事件a,事件b被保存到磁盤,同時序列號為4。
然后,事件a在事務2中被taken。
如果發生崩潰,則從磁盤讀取隊列檢查點。 請注意,由于檢查點發生在事務2之前,因此隊列中當前存在事件a和b。 然后讀取WAL并應用序列號大于4的任何已提交事務,從而導致從隊列中刪除“a”(該操作的event是[2,5,Take "a"])。
上述設計不包括兩個項目。 在檢查點發生時正在進行的Takes和Puts將丟失。 假設在獲取“a”之后發生了檢查點:
如果此時發生崩潰,則在上述設計下,事件“b”將在隊列上并且在重放時將重放序列號大于5的任何WAL條目。 將重播事務2的回滾[2,6,Rollback],但不會重放事務2的Taken[2,4,Take "a"]。 因此,“a”不會被放置在隊列中,從而導致數據丟失。 Puts也會采用類似的方案。 因此,當發生隊列檢查點時,也會寫出仍在進行中的事務,以便可以適當地解決上述場景。
FileChannel存儲在Flume項目的flume-file-channel模塊中,包名是org.apache.flume.channel.file。 上面描述的隊列的名稱為FlumeEventQueue,WAL名稱為Log。 隊列本身是一個循環數組,由內存映射文件支持,而WAL是一組使用LogFile類及其子類編寫和讀取的文件。
到此,關于“Apache的Flume和FileChannel有什么用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。