線上資料一般主要是落地(存儲到磁盤)或者通過socket傳輸給另外一個系統,這種情況下,你很難推動線上應用或服務去修改接口,實作直接向kafka裡寫資料,這時候你可能就需要flume這樣的系統幫你去做傳輸。
單機upd的flume source的配置,100+M/s資料量,10w qps flume就開始大量丢包,是以很多公司在搭建系統時,抛棄了Flume,自己研發傳輸系統,但是往往會參考Flume的Source-Channel-Sink模式。
一些公司在Flume工作過程中,會對業務日志進行監控,例如Flume agent中有多少條日志,Flume到Kafka後有多少條日志等等,如果資料丢失保持在1%左右是沒有問題的,當資料丢失達到5%左右時就必須采取相應措施。
采集層主要可以使用Flume、Kafka兩種技術。
Flume:Flume 是管道流方式,提供了很多的預設實作,讓使用者通過參數部署,及擴充API。
Kafka:Kafka是一個可持久化的分布式的消息隊列。
Kafka 是一個非常通用的系統。你可以有許多生産者和很多的消費者共享多個主題Topics。相比之下,Flume是一個專用工具被設計為旨在往HDFS,HBase發送資料。它對HDFS有特殊的優化,并且內建了Hadoop的安全特性。是以,Cloudera 建議如果資料被多個系統消費的話,使用kafka;如果資料被設計給Hadoop使用,使用Flume。
正如你們所知Flume内置很多的source和sink元件。然而,Kafka明顯有一個更小的生産消費者生态系統,并且Kafka的社群支援不好。希望将來這種情況會得到改善,但是目前:使用Kafka意味着你準備好了編寫你自己的生産者和消費者代碼。如果已經存在的Flume Sources和Sinks滿足你的需求,并且你更喜歡不需要任何開發的系統,請使用Flume。
Flume可以使用攔截器實時處理資料。這些對資料屏蔽或者過量是很有用的。Kafka需要外部的流處理系統才能做到。
Kafka和Flume都是可靠的系統,通過适當的配置能保證零資料丢失。然而,Flume不支援副本事件。于是,如果Flume代理的一個節點奔潰了,即使使用了可靠的檔案管道方式,你也将丢失這些事件直到你恢複這些磁盤。如果你需要一個高可靠性的管道,那麼使用Kafka是個更好的選擇。
Flume和Kafka可以很好地結合起來使用。如果你的設計需要從Kafka到Hadoop的流資料,使用Flume代理并配置Kafka的Source讀取資料也是可行的:你沒有必要實作自己的消費者。你可以直接利用Flume與HDFS及HBase的結合的所有好處。你可以使用Cloudera Manager對消費者的監控,并且你甚至可以添加攔截器進行一些流處理。
使用官方提供的flumeKafka插件,插件的實作方式是自定義了flume的sink,将資料從channle中取出,通過kafka的producer寫入到kafka中,可以自定義分區等。
1)Flume的channel分為很多種,可以将資料寫入到檔案。
2)防止非首個agent當機的方法數可以做叢集或者主備。
Flume的配置圍繞着source、channel、sink叙述,flume的叢集是做在agent上的,而非機器上。
優點:Nginx的日志格式是固定的,但是缺少sessionid,通過logger4j采集的日志是帶有sessionid的,而session可以通過redis共享,保證了叢集日志中的同一session落到不同的tomcat時,sessionId還是一樣的,而且logger4j的方式比較穩定,不會當機。
缺點:不夠靈活,logger4j的方式和項目結合過于緊密,而flume的方式比較靈活,拔插式比較好,不會影響項目性能。
Flume采集日志是通過流的方式直接将日志收集到存儲層,而kafka是将緩存在kafka叢集,待後期可以采集到存儲層。
Flume采集中間停了,可以采用檔案的方式記錄之前的日志,而kafka是采用offset的方式記錄之前的日志。

1)source:用于采集資料,Source是産生資料流的地方,同時Source會将産生的資料流傳輸到Channel,這個有點類似于Java IO部分的Channel。
2)channel:用于橋接Sources和Sinks,類似于一個隊列。
3)sink:從Channel收集資料,将資料寫到目标源(可以是下一個Source,也可以是HDFS或者HBase)。
注意:要熟悉source、channel、sink的類型