天天看點

Flume-ng HDFS Sink “丢資料”

線上對Flume流入HDFS配置path:p1,每分鐘切一個檔案,定期從p1從move完成的(rename)檔案到外部表進行計算分析,發現有“丢資料”現象:即在p1下經常看到幾GB的.tmp檔案,檢視Flume日志發現當出現CallTimeout Exception :HDFS IO ERROR後,sink一直向.tmp寫入,而不進行rename.

預設情況下,當BucketWriter flush超過calltimeout(default:10s)時,會報出異常,這時可能HDFS或者網絡異常,如果恰好到達了rollinterval,bucketWriter執行close->flush也會報出同樣的異常:Unexpectederror,沒有執行到renameBucket,此後該bucketWriter保持打開狀态(因為intervalroll隻在bucketWriter打開時進行一次排程),一直進行資料寫入不再roll直到1.建立寫的路徑2.Flume重新開機 3.打開到達maxOpenFiles,這些是不可接受的.

檢視源碼發現在每次flush時會判斷是否使用idleTime,如果使用則會排程一個idleHandler thread進行清理:1.關閉bucketWriter 2.從LRUList中摘除掉bucketWriter,而預設竟然是不啟用的=.=,後設定idleTime稍大于roll interval後,不再出現“資料丢失”

BTW,對于HDFS SINK,callTimeout和idleTimeout的預設值真是太傻了...

本文轉自MIKE老畢 51CTO部落格,原文連結:http://blog.51cto.com/boylook/1308188,如需轉載請自行聯系原作者

繼續閱讀