Source到Channel是事務性的,put事務
Channel到Sink也是事務性的,take事務
這兩個環節都不可能丟失數據, 傳輸失敗後會回滾doRollback。
但是
source:
(1)exec source ,後面接 tail -f
,這個數據也是有可能丟的。
(2)TailDir source ,這個是不會丟數據的,它可以保證數據不丟失。
channel:
採用MemoryChannel,(1)在agent宕機時候導致數據在內存中丟失;(2)Channel存儲數據已滿,導致Source不再寫入數據,造成未寫入的數據丟失;
採用FileChannel, 寫入磁盤是不可能丟失數據的
sink:
不會丟失, 會重複. 例如數據已經由Sink發出,但是沒有接收到響應,Sink會再次發送數據,導致數據重複
hdfs sink: flush 到 hdfs 的時候,可能由於網絡原因超時導致數據傳輸失敗,這個時候同樣地調用 doRollback 方法來進行回滾,回滾的時候,由於takeList中還有備份數據,所以將takeList中的數據原封不動地還給channel,這時候就完成了事務的回滾。
但是,如果 flush 到 hdfs 的時候,數據flush了一半之後出問題了,這意味着已經有一半的數據已經發送到 hdfs 上面了,現在出了問題,同樣需要調用doRollback方法來進行回滾,回滾並沒有“一半”之說,它只會把整個takeList中的數據返回給channel,然後繼續進行數據的讀寫。這樣開啓下一個事務的時候就容易造成數據重複的問題。
所以: Flume不會丟失數據,但是可能會數據重複
hdfs sink 優化:
調整文件滾動相關參數: 時間(1小時-2小時) or 大小128m、event個數(0禁止)具體參數:hdfs.rollInterval=3600,hdfs.rollSize=134217728,hdfs.rollCount =0
Hdfs Sink 寫文件 相關配置說明
hdfs.path -> hdfs目錄路徑
hdfs.filePrefix -> 文件前綴。默認值FlumeData
hdfs.fileSuffix -> 文件後綴
hdfs.rollInterval -> 多久時間後close hdfs文件。單位是秒,默認30秒。設置爲0的話表示不根據時間close hdfs文件
hdfs.rollSize -> 文件大小超過一定值後,close文件。默認值1024,單位是字節。設置爲0的話表示不基於文件大小
hdfs.rollCount -> 寫入了多少個事件後close文件。默認值是10個。設置爲0的話表示不基於事件個數
hdfs.fileType -> 文件格式, 有3種格式可選擇:SequenceFile, DataStream or CompressedStream
hdfs.batchSize -> 批次數,HDFS Sink每次從Channel中拿的事件個數。默認值100
hdfs.minBlockReplicas -> HDFS每個塊最小的replicas數字,不設置的話會取hadoop中的配置
hdfs.maxOpenFiles -> 允許最多打開的文件數,默認是5000。如果超過了這個值,越早的文件會被關閉
serializer -> HDFS Sink寫文件的時候會進行序列化操作。會調用對應的Serializer藉口,可以自定義符合需求的Serializer
hdfs.retryInterval -> 關閉HDFS文件失敗後重新嘗試關閉的延遲數,單位是秒
hdfs.callTimeout -> HDFS操作允許的時間,比如hdfs文件的open,write,flush,close操作。單位是毫秒,默認值是10000