Flume面試題整理

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具體是做什麼的(☆☆☆☆☆)

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的類型

Tags: