您的位置:首页 > 汽车 > 时评 > 大数据开发面试题【Kafka篇】

大数据开发面试题【Kafka篇】

2024/7/6 1:52:09 来源:https://blog.csdn.net/weixin_53191998/article/details/139230184  浏览:    关键词:大数据开发面试题【Kafka篇】

83、介绍下Kafka,Kafka的作用?Kafka的组件?适用场景?

kafka是一个高吞吐量、可扩展的分布式消息传递系统,在处理实时流式数据,并能够保证持久性和容错性
可用于数据管道、流分析和数据继承和关键任务应用(发布/订阅模式)
发布/订阅模式:
可以有多个topic主题、消费者消费数据之后,不删除数据、每个消费者相互独立,都可以消费数据

84、Kafka作为消息队列,它可解决什么样的问题?

异步:允许用户把一个消息放入队列,但并不立即处理他们,需要的时候再去处理
消峰:有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况
解耦:允许独立扩展或者修改两边的处理过程,只要确保他们遵守同样的接口约束

85、说下Kafka架构

生产者:消息的生产者,就是向kafka broker发消息的客户端
消费者:获取消息的客户端
消费组:有多个消费者组成,消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内的消费者消费;消费者组之间互补影响;所以消费者组逻辑上是一个订阅者
broker:一台kafka服务器就是一个broker,一个broker可以容纳多个topic
topic:一个队列,生产者和消费者面向的都是一个topic
partition:一个非常大的toipc可以分布到多个broker,一个topic可以分为多个partition
replica:
leader:
follower:

86、Kafka的工作原理和它与传统消息队列服务的不同之处?与RabbitMQ相比?

特点:
发布订阅模型;分区和复制;高吞吐量;实时数据流支持:传统消息队列只支持鵆并按需查看历史数据,而kafka还支持传输实时流数据
与传统消息队列相比:kafka优化了磁盘使用、利用操作系统缓存进行高速读写、并提高高效的分区和复制机制
RabbitMQ:在大规模实时性要求教导的场景下,使用kafka合适;在简单的消息传递与排队需求中,选择常见的消息队列较为合适、
补充:两种消息队列模式
点对点模式:点对点通常是基于拉取或者轮询的消息传送模型,发送到队列的消息被一个且只有一个消费者进行消费,生产者把消息放入消息队列后,由消费者主动拉取消息进行消费;优点是消费者拉取消息的频率可以由自己控制
发布订阅模式:生产者把消息放入消息队列以后,队列会把消息推送给该类的消费者

87、kafka的工作流程

创建一个kafka的生产者将源数据推送到kafka的topic中,然后使用消费者从topic订阅消息,并传递给处理引擎或者存储系统
在生产者流程中有两个关键参数(batch.size和linger.ms):只有数据累计达到batch.size后,sender才会发送数据,默认为16k;如果数据迟迟未达到batch.size,sender设置的linger.ms设置的时间达到以后就会发送数据,默认为0ms,表示没有延迟。
88、kakfa分区容错性
副本机制:kafka允许一个topic创建多个副本,并将这些副本分布在不同的broker上
数据复制:kafka使用异步复制机制来保证数据的可靠性,当消息被写入到leader副本时候,kafka会将其异步复制到follower副本中
ISR机制:用来保证副本之间的一致性,如果某个副本无法及时复制消息或者落后于其他副本太多,他将被从SIR集合中移除,直到追赶上其他副本的进度为止
故障转移:当某个broker宕机或者分区的领导副本不可用时候,kafka会自动进行故障转移,它会从ISR集合中选择一个新副本作为领导副本

89、kafka的分区策略

在这里插入图片描述

如上是kafka的构造方法:
1、如果指定了partition的情况下,直接将指明的值作为partition值
2、如果没有指明partition值但有key的情况之下,将key的hash值与topic的partition数进行取余得到partition的值,并将对应的value写入到对应的分区中
3、既没有partition值又没有key值的情况下,kafka采用粘性分区器(sticky partition),会随机选择一个分区,并尽可能一直使用或者分区,直到该分区的batch已满或者已完成,kafka再随机一个分区进行使用。

90、Kafka如何尽可能保证数据可靠性?

1、保证分区消息的顺序———分区有序
2、只有当消息被写入分区的所有同步副本时候,它才被认为是已经提交的(ACK应答)
ACK是指:ackowledgement,用于控制生产者发送消息时候的可靠性和性能,
ACK=0:生产者对象将数据通过网络客户端将数据发送到网络数据流中的时候,kafka就对当前的数据请求进行了响应,确认应答,只是能保证数据已经通过网络发送给kafka,并不能保证kafka一定能接收到,无法保证数据的可靠性,但通信效率高
ACK=1:生产者等待leader副本成功写入消息到日志文件后就认为发送成功,适用于对可靠性较高的场景,这种应答方式,数据已经存储到分区的leader副本中,数据相对安全,但数据并没有及时备份到follower副本,一旦broker崩溃,数据也会丢失
ACK=all或者-1(默认):生产者等待ISR中所有副本成功写入消息后,就认为发送成功,适用于对数据不可丢失的高可靠性要求场景(一般是金融级别的才会使用这种配置)
3、只要还有一个副本是活跃的,那么已经提交的消息就不会丢失
4、消费者只能读取已经提交的消息
5、kafka的复制机制和分区的多副本架构是kafka可靠性保证的核心(topic被分为多个分区,分区是基本的数据块,分区存储在单个磁盘上,kafka可以保证分区里的事件是有序的,分区可以有多个副本)

91、kafka的同步与异步发送

同步模式:逐条发送,用户线程选择同步,效果是逐条发送,因为请求队列InFlightRequest中永远最多有一条数据,第一条响应到达以后,才会请求第二条
异步模式:如果设置成异步模式。可以运行生产者以batch的形式push数据,这样会极大的提高broker的性能,会增加丢失数据的风险
如果kafka通过主线程代码将一条数据放入到缓冲区中后,无需等待数据的后续发送过程,就直接发送下一条数据的场合,就是异步发送
如果Kafka通过主线程代码将一条数据放入到缓冲区后,需等待数据的后续发送操作的应答状态,才能发送一下条数据的场合,我们就称之为同步发送。所以这里的所谓同步,就是生产数据的线程需要等待发送线程的应答(响应)结果。

92、kafka数据丢失和数据重复原因和解决办法

数据丢失原因:不等待broker的ack,broker接收到磁盘就已经返回了,当broker故障时候会丢失数据
数据重复原因:当ack设置为1的时候,假如因为网络原因,kafka没有将应答消息发送给生产者,一旦超时时间阈值,就认为kafka数据丢失,此时生产者会尝试对超时的请求数据进行重试,此时kafka中存在的数据是重复的

补充:数据幂等性

生产者同样的一条数据,无论向kafka发送多少次,kafka只会存储一条数据,
幂等性只能保证单分区消息有序不重复,多分区不能保证幂等性
数据传输语义:
https://infinity-culture.feishu.cn/sync/OWY5dMNgjsOajnbyFSxcrIq7nBd

93、生产者消费者模式与发布订阅模式有何异同?

生产者消费者模式,指的是由生产者将数据源源不断推送到消息中心,有不同的消费者从消息中心取出数据做自己的处理,在同一类别下,所有消费者拿到的都是同样的数据
发布订阅模式:本质上也是一种消费者模式,由订阅者首先向消息中心指定自己对哪些数据感兴趣,发布者推送的数据经过消息中心后,每个订阅者拿到的仅仅是自己感兴趣的数据
生产者消费者是所有消费者抢占消息,订阅发布是所有订阅者共享信息;
主动权不同,生产消费者主动权在消费者,订阅发布主动权在发布者,

94、kafka如何保证全局有序

kafka通过分区和分区内的顺序保证全局有序,将数据分为多个topic,每个topic可以有多个分区,每个分区都有唯一的标识,并且在集群中的多个节点上进行复制以提高高可用性
每个分区内,kafka使用offset来标识消息的顺序,生产者将消息切入待定的分区时,kafka会为每个消息分配一个递增的偏移量,消费者通过指定分区和偏移量来读取消息,保证消费者按照指定顺序处理消息
如果某一个topic只有一个分区,那么该主题的消息顺序是全局有序的
如果一个topic有多个分区,kafka可以根据消息的key来选择将消息写入哪个分区,具有相同键的消息将被写入同一个分区,并且同一个分区内的消息顺序是有序的

95、Kafka为什么同一个消费者组的消费者不能消费相同的分区?

kafka中同一个消费者组的消费者组不能消费相同的分区是因为kafka中采用分区分配策略,确保每个分区被消费者组的的一个消费者消费,主要是为了确保消息的顺序性和负载均衡,使得每个消费者都能够处理大致相同的数量的消息

96、Kafka读取消息是推还是拉的模式?有什么好?

kafka的消息读取模式是pull拉模式,消费者主动拉取kafka服务器的消息
好处:
1、消费者可以根据自身的处理能力和需求决定拉取消息的速率
2、节约资源:可以避免服务器主动推送大量消息给消费者,减少网络带宽的和服务资源的消耗
3、容错性:在拉取过程中出现错误,可以重新拉取相同的消息进行重试
4、消息积压控制:消费者可以根据自身的处理能力调整拉取消息的速率
如果是push模式,多个分区的数据同时推送给消费者进行处理,明显一个消费者的消费能力是有限的,消费者无法快速处理数据,就会导致数据的积压,导致网络、存储的压力,影响效率

补充:消费者组模式

如果topic的分区的数据过多,消费时间很长,至此对kafka1的压力就很大;
在kafka中,每个消费者都对应一个消费者组,如果kafka想要消费消息,那么需要指定消费那个topic的消息以及自己的消费组id(groupId)

在消费者组中,多个实例共同订阅若干个topic,实现共同消费,同一个组下的每个实例都配置有相同的ID,被分配不同的订阅分区,当某个实例挂掉的时候,其他实例会自动地承担起它负责消费的分区

97、kafka高吞吐的原理

1、顺序读写磁盘,kafka消息是不断追加到文件中的,使得kafka可以充分利用磁盘的互相内需读写性能,不需要次哦按磁头的寻道时间,快速读写
2、kafka中的topic被分为了多个partition,每个partition又分为多个segment,一个队列的消息实际上是保存在多个片段文件中通过分段的反射光hi,每次文件操作都是对一个小文件进行操作,增加了并行处理的能力
3、kafka的瓶颈不是cpu或者磁盘,而是网络带宽

98、说下Kafka中的Partition?

kafka的partirion过程是将topic划分为多个独立的数据片段的过程,每个parririon是一个有序的不可变的消息队列,消息按照生产者的发送顺序一次追加到partition中,每个partition在物理上对应一个独立的日志文件,被分成多个segment
Partition的作用在于:
实现消息的水平扩展:Kafka可以在多个Broker上并行处理不同Partition的消息,提高了整个系统的吞吐量。
实现数据的持久化:每个Partition都会被复制到多个Broker上,确保数据的可靠性和冗余。
实现消息的顺序性:在同一个Partition中,消息的顺序是有序的,保证了消息的有序性处理。
每个Partition都有一个唯一的标识符(Partition ID),并且可以配置多个副本(Replica),其中一个为Leader副本,其它副本为Follower副本。Leader副本负责处理来自Producer和Consumer的请求,Follower副本用于备份和故障转移。
在生产者发送消息时,可以选择指定消息要发送到的Partition,如果没有指定,Kafka会根据某种策略(如Hash值)将消息平均分配到各个Partition中。而在消费者消费消息时,可以订阅一个或多个Partition,每个消费者只会消费其中一个Partition上的消息。

99、如何使用kafka实现实时数据流处理?

需要创建一个kafka的producer将元数据推送到kafka potic中,再使用kafka的consumer从topic中订阅消息,并将其传递给流处理引擎spark或者flink,对接受到的消息进行实时计算和转换,将结果写回固定的外部存储

100、flink的checkpoint和kafka的offset关联是什么

flink的checkpoint用于记录flink的应用程序的状态,而kafka offset用于记录消费者的topic的位置,两者相互结合,以确保在故障恢复后不会重复处理kafka中的消息
补充:kafka中的数据模型
顾名思义就是kafka的架构;

补充:kafka为什么可以实现高效传输数据

1、利用Partition实现并行处理
一个topic包好多个partition,不同的partition位于不同的节点上,从而可以实现磁盘间的并行处理,充分发挥多磁盘的优势。
2、顺序写磁盘(提供预读和写技术,磁盘的顺序写大多数情况下比随机写内存还要快)
影响磁盘的关键因素是磁盘的完成一个IO请求所花费的时间,它由寻道时间、旋转时间和数据传输时间三部分构成。kafka中都通过追加的方式尽可能的将随机IO转换为顺序IO,以此来降低寻址和旋转延时
3、充分利用页缓存Page Cache
引入cache层是为了提高linux操作系统对磁盘访问的性能,cache层在内存中缓存了磁盘上的部分数据,免除了对底层磁盘的操作,提高了性能(liunx的实现中,文件cache层分为两个层面,一个page cache,另一个是buffer cache,每个page chche有多个buffer chche,Page Cache 主要用来作为文件系统上的文件数据的缓存来用,尤其是针对当进程对文件有 read/write 操作的时候。Buffer Cache 则主要是设计用来在系统对块设备进行读写的时候,对块进行数据缓存的系统来使用。)
broker收到数据后,写磁盘时只是将数据写入page chche中,并不能保证数据一定会完全写入磁盘,可能会造成页缓存中的数据为写入磁盘从而造成数据丢失
4、零拷贝(减少拷贝次数)
零拷贝是一种为了解决数据从内核缓存到用户缓存的CPU拷贝产生的性能消耗的技术。
kafka中存在大量的网络数据持久化到磁盘和磁盘文件需要通过网络发送的过程,影响kafka的整体吞吐量
DMA:直接存储器,是一个无需CPU参与,让外设和系统内存之间进行双向数据传输的硬件机制,可以使系统CPU从实际的IO数据传输过程中脱离出来,提高系统的吞吐率
当数据从磁盘经过DMA到内核缓存后,为了减少CPU的拷贝性能损耗,操作系统会将该内核缓存与用户层,减少以此CPU拷贝的过程,
网络数据持久化到磁盘中:
在这里插入图片描述

补充:kafka中的offset

在kafka中,每个topic分区下的每一条消息都被赋予了一个唯一的ID数值,用于标识它在分区中的位置,这个ID数值,就被称为唯一,也叫做偏移量,一旦消费被写入分区日志中,它的位移将不能被修改

补充:削峰、异步、解耦

削峰:就是缓冲瞬时的突发流量,使其平滑,对于上游发送能力很强的系统,若没有消息中间件的保护,脆弱的下游系统可能会被直接压垮导致雪崩
异步:不用同步等待下游将数据处理完,将喜喜发送到消息队列中即可返回,不阻碍主流程
解耦:

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com