【翻譯】關於Apache Flume FileChannel

這篇文章關於Apache Flume中的File Channel,Apache Flume 是一個分佈式,可靠的,高可用的服務,能夠有效的收集,聚合,傳輸海量的日誌數據,Flume具有基於流數據的簡單靈活的架構,具有魯棒性,容錯性,可靠性機制和許多故障轉移和回滾機制。
Flume使用簡單可擴展的數據模型,支持在線分析應用程序。
FileChannel是支持並行加密寫入多個磁盤的持久化Flume channel.

概述

當使用Flume 時,每個工作流都擁有Source, Channel, and Sink,典型例子是一個webserver通過RPC將事件(events)寫入Source(例如:Avro Source),sources又將events寫入MemoryChannel,同時HDFS Sink從MemoryChannel消費events,並寫入HDFS
【翻譯】關於Apache Flume FileChannel

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。
【翻譯】關於Apache Flume FileChannel

WAL包含三個重要項:事務ID,序列號和事件數據。 每個事務都有一個唯一的事務ID,每個事件都有一個唯一的序列號。 事務id僅用於將事件分組到事務中,而在重放日誌時使用序列號。 在上面的示例中,事務id爲1,序列號爲1,2和3。
當隊列保存到磁盤(檢查點)時,序列號也會增加並保存。 在重新啓動時,首先加載來自磁盤的隊列,然後重放序列號大於隊列的所有WAL條目。 在檢查點操作期間,通道被鎖定,因此任何Put或Take操作都不能改變它的狀態。 允許在檢查點期間修改隊列將導致存儲在磁盤上的隊列的快照不一致。
在上面的示例隊列中,在提交事務1之後發生檢查點,導致隊列中的事件a,事件b被保存到磁盤,同時序列號爲4。

然後,事件a在事務2中被taken。
【翻譯】關於Apache Flume FileChannel
如果發生崩潰,則從磁盤讀取隊列檢查點。 請注意,由於檢查點發生在事務2之前,因此隊列中當前存在事件a和b。 然後讀取WAL並應用序列號大於4的任何已提交事務,從而導致從隊列中刪除“a”(該操作的event是[2,5,Take "a"])。

上述設計不包括兩個項目。 在檢查點發生時正在進行的Takes和Puts將丟失。 假設在獲取“a”之後發生了檢查點:
【翻譯】關於Apache Flume FileChannel

如果此時發生崩潰,則在上述設計下,事件“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類及其子類編寫和讀取的文件。

結論

FileChannel爲Flume用戶提供了面對硬件,軟件和環境故障時的耐用性,同時保持了高吞吐量。 對於耐用性和高吞吐很重要的大多數拓撲而言,推薦使用File Channel。

原文:http://blog.cloudera.com/blog/2012/09/about-apache-flume-filechannel/#comment-18923

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章