kafka面试(kafka面试题高频)
本篇文章给大家谈谈kafka面试,以及kafka面试题高频对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
Kafka相关面试题
title: Kafka常见问题
date: 2020-04-01 16:25:49
update: 2020-04-01 20:31:30
excerpt: Kafka 面试中常见问题
toc_min_depth: 3
tags:
Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。
位置
内容
kafka中的消费者在读取服务端的数据时,需要将服务端的磁盘文件通过网络发送到消费者进程,网络发送需要经过几种网络节点。如下图所示:
传统的读取文件数据并发送到网络的步骤如下:
(1)操作系统将数据从磁盘文件中读取到内核空间的页面缓存;
(2)应用程序将数据从内核空间读入用户空间缓冲区;
(3)应用程序将读到数据写回内核空间并放入socket缓冲区;
(4)操作系统将数据从socket缓冲区复制到网卡接口,此时数据才能通过网络发送。
通常情况下,Kafka的消息会有多个订阅者,生产者发布的消息会被不同的消费者多次消费,为了优化这个流程,Kafka使用了“零拷贝技术”,如下图所示:
“零拷贝技术”只用将磁盘文件的数据复制到页面缓存中一次,然后将数据从页面渗掘哪缓存直接发送到网络中(发送给不同的订阅者时,都可以使用同一个页面缓存),避免了重复复制操作。
如果有10个消费者,传统方式下,数据复制次数为4*10=40次,而使用“零拷贝技术”只需要1+10=11次,一次为从磁盘复制到页面缓存,10次表示10个消费者各自读取一次页面缓存。
传统的文件拷贝通常需要从用户态去转到核心态,经过read buffer,然丛码后再返回到用户态的应用层buffer,然后再从用户态把数据拷贝到核心态的socket buffer,然后发送到网卡。
传统的数据传输需要多次的用户态和核心态之间的切换,而且还要把数据复制多次,最终才打到网卡。
如果减少了用户态与核心态之间的切换,是不是就会更快了呢?
此时我们会发现用户态“空空如也”。数据没有来到用户态,而是直接在核心态就进行了传输,但这样依然还是有多次复制。首先数据被读取到read buffer中,然后发到socket buffer,最后才发到网卡。虽然减少了用户态和核心态的切换,但依然存在多次数据复制。
如果可以进一步减少数据复制的次数,甚至没有数据复制是不是就会做到最快呢?
DMA
别急,这里我们先介绍一个新的武器:DMA。
DMA,全称叫Direct Memory Access,一种可让某些散清硬件子系统去直接访问系统主内存,而不用依赖CPU的计算机系统的功能。听着是不是很厉害,跳过CPU,直接访问主内存。传统的内存访问都需要通过CPU的调度来完成。如下图:
而DMA,则可以绕过CPU,硬件自己去直接访问系统主内存。如下图:
很多硬件都支持DMA,这其中就包括网卡。
零拷贝
回到本文中的文件传输,有了DMA后,就可以实现绝对的零拷贝了,因为网卡是直接去访问系统主内存的。如下图:
Java的零拷贝实现
在Java中的零拷贝实现是在FileChannel中,其中有个方法transferTo(position,fsize,src)。
传统的文件传输是通过java.io.DataOutputStream,java.io.FileInputStream来实现的,然后通过while循环来读取input,然后写入到output中。
零拷贝则是通过java.nio.channels.FileChannel中的transferTo方法来实现的。transferTo方法底层是基于操作系统的sendfile这个system call来实现的(不再需要拷贝到用户态了),sendfile负责把数据从某个fd(file descriptor)传输到另一个fd。
sendfile:
Java的transferTo:
传统方式与零拷贝性能对比
可以看出速度快出至少三倍多。Kafka在文件传输的过程中正是使用了零拷贝技术对文件进行拷贝。建议以后多用FileChannel的transferTo吧。
总结
需要用到的类:
KafkaProducer :需要创建一个生产者对象,用来发送数据
ProducerConfig :获取所需的一系列配置参数
ProducerRecord :每条数据都要封装成一个ProducerRecord对象
几个比较重要的配置项
//kafka集群,broker-list
props.put("bootstrap.servers", "hadoop102:9092");
[img]大数据架构选择消息队列,我选kafka。面试官问为什么?
毫无疑问 Kafka!
最多前面加个Flume。
任睁配卜何选型的原因,都源自你的需求是什么。 Fast,Scalable,Durable是我的需求,Kafka完美满足。卖或稍微讲些细节,好多想必大家也都知道。
Kafka将数据写到磁盘,实际上都会写到OS的page cache里, 而读的时候又用sendfile非常高效的将数据传输到NIC。
Kafka的扩展性也非常好,只要增加broker即可。Kafka的逻辑也非常清晰,可以将不同业务逻辑的数据写进不同到topic,而topic又可以切分成若干个悉穗partition来并行处理,并且Kafka0.9后,zk只需要被broker所使用,consumer并不再需要使用zk来记录offset,大大降低zk的压力,同时也从侧面降低了scale的压力。
Kafka也有比较友好的删除策略。可以直接按照max age或者max size自动删除,也可以按照key进行compact,基本上都能满足需求。另一方面,Kafka的社区非常活跃,并且现在几乎所有流行的(流式)计算框架都支持Kafka,如Spark Streaming,Storm,Flink 等。对了,有个叫camus的工具定期可以将Kafka里的数据搬到HDFS上。
消息队列面试题
综上,总结如下:
【activeMQ】
【rabitMQ】
【rocketMQ】
【kafka】
生产者森轿投递消息到MQ,MQ存储消息,消费者从MQ消费消息:
要分别确保上述三个过程都是圆扮成功的,有如下做法此腔肆:
解决方法如下:
【rabbitmq解决积压范例】
【kafka解决范例】
关于kafka面试和kafka面试题高频的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。