1、Flume使用場景(☆☆☆☆☆)
線上資料一般主要是落地(儲存到磁碟)或者通過socket傳輸給另外一個系統,這種情況下,你很難推動線上應用或服務去修改介面,實現直接向kafka裡寫資料,這時候你可能就需要flume這樣的系統幫你去做傳輸。
2、Flume丟包問題(☆☆☆☆☆)
單機upd的flume source的配置,100+M/s資料量,10w qps flume就開始大量丟包,因此很多公司在搭建系統時,拋棄了Flume,自己研發傳輸系統,但是往往會參考Flume的Source-Channel-Sink模式。
一些公司在Flume工作過程中,會對業務日誌進行監控,例如Flume agent中有多少條日誌,Flume到Kafka後有多少條日誌等等,如果資料丟失保持在1%左右是沒有問題的,當資料丟失達到5%左右時就必須採取相應措施。
3、Flume與Kafka的選取
採集層主要可以使用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對消費者的監控,並且你甚至可以新增攔截器進行一些流處理。
4、資料怎麼採集到Kafka,實現方式
使用官方提供的flumeKafka外掛,外掛的實現方式是自定義了flume的sink,將資料從channle中取出,通過kafka的producer寫入到kafka中,可以自定義分割槽等。
5、flume管道記憶體,flume當機了資料丟失怎麼解決
1)Flume的channel分為很多種,可以將資料寫入到檔案。
2)防止非首個agent當機的方法數可以做叢集或者主備。
6、flume配置方式,flume叢集(詳細講解下)
Flume的配置圍繞著source、channel、sink敘述,flume的叢集是做在agent上的,而非機器上。
7、flume不採集Nginx日誌,通過Logger4j採集日誌,優缺點是什麼?
優點:Nginx的日誌格式是固定的,但是缺少sessionid,通過logger4j採集的日誌是帶有sessionid的,而session可以通過redis共享,保證了叢集日誌中的同一session落到不同的tomcat時,sessionId還是一樣的,而且logger4j的方式比較穩定,不會當機。
缺點:不夠靈活,logger4j的方式和專案結合過於緊密,而flume的方式比較靈活,拔插式比較好,不會影響專案效能。
8、flume和kafka採集日誌區別,採集日誌時中間停了,怎麼記錄之前的日誌?
Flume採集日誌是通過流的方式直接將日誌收集到儲存層,而kafka是將快取在kafka叢集,待後期可以採集到儲存層。
Flume採集中間停了,可以採用檔案的方式記錄之前的日誌,而kafka是採用offset的方式記錄之前的日誌。
9、flume有哪些元件,flume的source、channel、sink具體是做什麼的(☆☆☆☆☆)
1)source:用於採集資料,Source是產生資料流的地方,同時Source會將產生的資料流傳輸到Channel,這個有點類似於Java IO部分的Channel。
2)channel:用於橋接Sources和Sinks,類似於一個佇列。
3)sink:從Channel收集資料,將資料寫到目標源(可以是下一個Source,也可以是HDFS或者HBase)。
注意:要熟悉source、channel、sink的型別