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