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是个更好的选择。
react面试题插件和组件的区别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的类型