Flume到底會不會丟失數據?

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

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