天天看點

《Flume日志收集與MapReduce模式》一3.2 檔案通道

本節書摘來自華章出版社《flume日志收集與mapreduce模式》一書中的第3章,第3.2節,作者 [美] 史蒂夫·霍夫曼(steve hoffman)斯裡納特·佩雷拉(srinath perera),更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視

檔案通道指的是将事件存儲到代理本地檔案系統中的通道。雖然要比記憶體通道慢一些,不過它卻提供了持久化的存儲路徑,可以應對大多數情況,它應該用在資料流中不允許出現缺口的場合。

這種持久化能力是由write ahead log(wal)以及一個或多個檔案存儲目錄聯合提供的。wal用于以一種原子且安全的方式追蹤來自于通道的所有輸入與輸出。通過這種方式,如果代理重新開機,那麼wal可以重放,進而確定在清理本地檔案系統的資料存儲前進入到通道中的所有事件都會被寫出。

要想使用檔案通道,請将通道的type參數設定為file:

《Flume日志收集與MapReduce模式》一3.2 檔案通道

上面為名為agent的代理定義了一個名為c1的檔案通道。

下面是一個配置參數表格,你可以據此調整預設值:

《Flume日志收集與MapReduce模式》一3.2 檔案通道

要想指定flume代理持有資料的位置,你需要設定checkpointdir

與datadirs屬性:

《Flume日志收集與MapReduce模式》一3.2 檔案通道

從技術上來說,這些屬性并不是必需的,對于開發來說,其預設值已經很不錯了。不過,如果代理中配置了多個檔案通道,那麼隻有第一個通道會啟動。對于使用了多個檔案通道的産品部署與開發來說,你應該針對每個檔案通道存儲區域使用不同的目錄路徑,并考慮将不同的通道放在不同的磁盤上以避免io争搶。此外,如果使用大容量的機器,那麼請考慮使用某種形式的包含了條帶化的raid(raid 10、50、60)來獲得更好的磁盤性能,而不是購買更昂貴的10k或15k驅動器或是ssds。如果沒有raid條帶化但卻有多個磁盤,那麼請将datadirs設為包含每個存儲位置的逗号分隔的清單。使用多個磁盤會分散磁盤通路,類似于條帶化的raid,不過卻沒有raid 50/60的計算代價以及raid 10的50%的空間浪費。你可以測試一下系統,看看raid的代價是否能夠彌補這種速度上的差異。既然硬碟驅動器的故障是存在的,那麼你就應該首選某些raid配置而不是單獨的磁盤,進而防止出現與單個驅動故障相關的資料丢失情況的發生。

出于相同的原因,你不應該使用nfs存儲。使用jdbc通道是個不好的做法,因為它會引入瓶頸和單點故障,這些都是高性能分布式系統在設計上應該極力避免的。

《Flume日志收集與MapReduce模式》一3.2 檔案通道

java.lang.noclassdeffounderror: org/apache/hadoop/io/writable

預設的檔案通道容量是100萬個事件,無論事件内容的大小是多少均如此。如果到達了通道容量,那麼源就無法再接收資料了。這個預設值對于低容量的場景來說還不錯。如果接收的資料量很大,導緻無法忍受正正常劃或未規劃的中斷,那麼你可以調整該值。比如,hadoop中有很多配置改變需要重新開機叢集。如果flume向hadoop中寫入的是一些重要資料,那麼檔案通道就應該調整以接受hadoop重新開機的時間(或許對于意外的情況還需要添加一個緩沖)。如果叢集或是其他系統是不可靠的,那麼你可以将這個值設得更高一些來處理更長的當機時間。有時,你會遇到磁盤空間不夠用的情況,是以請設定好一個上限值(或是購買更大的磁盤)。

keep-alive參數類似于記憶體通道。它指的是滿載的通道在放棄前,源嘗試寫入到通道中的最大等待時間。如果逾時前又有可用空間了,那麼寫入就将成功;否則會向源抛出channelexception異常。

屬性transactioncapacity指的是在單個事務中所允許的最大事件數量。對于某些源來說,它們會将事件集中到一起,然後在單個調用中傳遞給通道,對于這種情況來說,該參數就很重要。很多時候,你無需改變其預設值。将該值設得比較高會在内部配置設定額外的資源,是以除非遇到了性能問題,否則不應該增加其值。

checkpointinterval屬性指的是兩個檢查點(還會将日志檔案寫到logdirs中)之間間隔的毫秒數,不能将該值設為低于1000毫秒。

檢查點檔案也會使用maxfilesize屬性根據寫入到其中的檔案量進行卷動。如果想節省一些磁盤空間,那麼你可以針對低負載的通道降低該值的大小。假如最大的檔案大小是50000位元組,但通道一天隻會寫入500位元組,那麼要想填充滿單個日志需要100天的時間。假如在第100天的時候寫入了2000位元組,那麼有些資料就會被寫到舊的日志檔案中,新的檔案則從剩餘部分開始。在卷動後,flume會嘗試删除不再需要的日志檔案。由于完整的日志有未被處理的記錄,是以還不能将其删除。下一次清理舊日志檔案可能還得100天之後。如果舊的50000位元組檔案留存的時間更長,那就沒什麼問題,不過由于預設大小是2gb左右,是以每個通道所用的磁盤空間是其兩倍(4gb)。取決于可用的磁盤空間大小以及代理中配置的通道數量,這可能是個問題,也可能不是什麼問題。如果機器有大量的存儲空間,那麼使用其預設值就可以了。

最後,minimumrequiredspace屬性指的是你不想用作日志的空間數量。如果嘗試使用與datadir路徑相關聯的最後500mb磁盤空間,那麼預設配置就會抛出異常。這個限制适用于所有通道,是以如果配置了3個檔案通道,那麼其上限依然是500mb而不是1.5gb。你可以将其值設為1mb那麼小,不過一般來說,如果磁盤使用率接近于100%,就會出現一些不好的結果。

繼續閱讀