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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/243535.html
標籤:其他
下一篇:GT-suite2016最新
