flume使用注意事項

flume可以有多個source  多個channel  多個sink  

爲什麼要把flume分爲source  chanel  sink多個組件呢?有多個組件是爲了更加靈活,可以得到不同的來源,傳入不同的地方       也可以只有一個source  channel 而沒有sink

也可以是其他情況

 

 

agent---flume

source蒐集數據(如:每次來一行數據,就讀取一行,那麼用tail -f         用exec source  裏面配置command參數:配置tail -f命令)

(jdbc  memory  kafka   file) Channel    爲什麼要用channel呢?作爲緩衝的一個過程,防止source和sink速率不匹配的問題

sink

 

場景;要求實時採集nginx的log文件   並且保證數據不丟掉       數據丟失情況:nginx宕機,如果flume機器宕機 ,重新啓動flume,那麼flume會接着原來的數據繼續讀 (需要記錄偏移量position)

自定義source(實現上面的可以記錄偏移量的source):  繼承AbstractSource,實現EventDrivenSource接口,Configurable接口 

     1 讀取配置文件。讀取哪個文件,編碼集,偏移量寫到哪個文件,多長時間讀一次,多長時間檢測一下文件是否有新內容

 

具體配置文件如下顯示:

以上配置是有多個sources  channels 和sinks的情況  自定義的source情況r1

2 啓動的時候調用同步方法(哇,多線程耶!!!)。創建一個線程讀取文件內容 

3調用stop方法停止線程池的運行

flume source生命週期:先構造器  再configure方法  在start   然後processor.process方法

 

小插曲:init方法先執行還是構造器先執行呢?當然是構造器  init是方法  需要有對象後才能執行   

              剛突然發現  記錄日誌信息的log4j創建logger的時候竟然是工廠模式 LoggerFactory.getLogger(TailfileSource.class)

 

flume是支持事物的,完成了sink寫入後再通知偏移量修改,就能確切保證數據偏移量記錄在多線程情況下的安全

 

Kafka的Channel :問題:如tailfileSource只能監聽一個文件,memoryChannel數據會有堆積,內存可能溢出,FileChannel又太慢,美團就提供了一個方案  memorychannel和filechannel並存的情況,如果memory達到一定值,進行filechannel  。

使用kafka作爲緩衝,效率變高,並且數據不會丟失(數據存有副本)。

小插曲:其實nginx是可以直接對接kafka的  但是可能原來的企業存在着其他形式的log收集,所以需要flume這種日誌收集系統來收集不同來源的數據

 

多個flume會不會重複消費數據呢?只要指定多個flume實例在同一個組內可以避免重複消費。

flume自定義攔截器:本身有攔截器如:Regex Filtering Interceptor正則表達式匹配攔截

    如果自定義一個攔截器,實現把flume中數據變成json格式  需要繼承Interceptor接口,實現內部類繼承inteceptor接口的內部接口Builder

 

flume基礎學習:http://www.cnblogs.com/zhangyinhua/p/7803486.html

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