這篇文章關於Apache Flume中的File Channel,Apache Flume 是一個分佈式,可靠的,高可用的服務,可以有效的收集,聚合,傳輸海量的日誌數據,Flume具備基於流數據的簡單靈活的架構,具備魯棒性,容錯性,可靠性機制和許多故障轉移和回滾機制。
Flume使用簡單可擴展的數據模型,支持在線分析應用程序。
FileChannel是支持並行加密寫入多個磁盤的持久化Flume channel.web
當使用Flume 時,每一個工做流都擁有Source, Channel, and Sink,典型例子是一個webserver經過RPC將事件(events)寫入Source(例如:Avro Source),sources又將events寫入MemoryChannel,同時HDFS Sink從MemoryChannel消費events,並寫入HDFSapache
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"])。ide
上述設計不包括兩個項目。 在檢查點發生時正在進行的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類及其子類編寫和讀取的文件。操作系統
FileChannel爲Flume用戶提供了面對硬件,軟件和環境故障時的耐用性,同時保持了高吞吐量。 對於耐用性和高吞吐很重要的大多數拓撲而言,推薦使用File Channel。
原文:http://blog.cloudera.com/blog/2012/09/about-apache-flume-filechannel/#comment-18923