大数据开发面试题【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数值,就被称为唯一,也叫做偏移量,一旦消费被写入分区日志中,它的位移将不能被修改

补充:削峰、异步、解耦

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/653918.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言作为计算机行业的基础之一,是否制约了行业本身的发展?

c不是计算机行业的基础啦,你想,c语言出现时已经有一套成熟的计算机体系,有基于内存地址的寻找指令、数据的工作方式,有汇编语言,那搞出c这种高级语言就很正常啊!刚好我有一些资料,是我根据网友给…

C++中的结构体——结构体定义和使用

一、结构体基本概念 结构体属于用户自定义的数据类型,允许用户存储不同的数据类型 二、结构体定义和使用 语法: struct 结构体名 { 结构体成员列表 }; 通过结构体创建变量的方式有三种: 1. struct 结构体名 变量名 2.struct…

智慧农田视频监控技术应用:智能监管引领农业新时代

据新闻报道,5月24日合肥市公安局接到群众报警,反映自己辛苦种植的小麦有几十亩地被人偷偷用收割机盗割。公安机关迅速出警并立案侦查,通过查看监控视频得知,用户所在的公司租用了几千亩土地进行农业种植,因公司与村民之…

C语言 数组——数组的定义和初始化

目录 为什么使用数组(Array)? 一维数组的定义 一维数组的初始化 一维数组元素的访问 一维数组元素的赋值 数组的逻辑存储结构 数组的物理存储结构 二维数组的定义和初始化 为什么使用数组(Array)? 一维数组的定义 一维 数组的定义 int a[10]; 定义一个有 10 个 int 型元素的…

破解微信校验难题,Xinstall助你轻松实现Universal Link功能!

在移动互联网时代,App的推广和运营离不开各种技术手段的支持。其中,Universal Link作为连接App和网页的重要桥梁,被广大开发者所青睐。然而,很多开发者在使用Universal Link时遇到了微信校验不通过的问题,这不仅影响了…

堆排序和Topk问题

堆排序 堆排序即利用堆的思想来进行排序, 总共分为两个步骤: 1. 建堆 升序:建大堆; 降序:建小堆 2 .利用堆删除思想来进行排序 利用堆删除思想来进行排序 建堆和堆删除中都用到了向下调整,因此掌握了…

Go 错误日志处理

是不是所有的 if err ! nil 的地方都应该输出错误日志? 打印过多的错误日志会导致日志文件变得冗长和难以阅读。 其次,重复的错误信息会增加冗余。 此外,每一层都打印错误日志,一旦错误信息设计不当,可能会导致上下…

VCRUNTIME140_1.dll丢失是怎么回事?vcruntime140_1.dll无法继续执行代码的处理方法

VCRUNTIME140_1.dll丢失是怎么回事?问出这样的问题的人,一般是遇到vcruntime140_1.dll无法继续执行代码的问题了,找不到VCRUNTIME140_1.dll文件,那么程序就肯定是启动不了的,程序的启动是需要VCRUNTIME140_1.dll文件的…

全局数据 与 singleton 类的选择

1,singleton 相对于全局数据的优势 使用 Singleton 类相对于全局数据具有以下好处: 1.1. 延迟初始化:Singleton 类可以实现延迟初始化,即在需要时才创建实例,而全局数据在程序启动时就会被初始化。这可以节省资源并提…

设计软件有哪些?建模和造型工具篇(3),渲染100邀请码1a12

这次我们接着介绍建模工具。 1、FloorGenerator FloorGenerator是由CG-Source开发的3ds Max插件,用于快速创建各种类型的地板和瓷砖。该插件提供了丰富的地板样式和布局选项,用户可以根据需要轻松创建木质地板、石板地板、砖瓦地板等不同风格的地面。F…

【常用的队列总结】

文章目录 队列的介绍Queue队列的基本概念与操作队列的基本概念 常见的队列介绍非阻塞队列LinkedList:ArrayDeque:PriorityQueue: 阻塞队列ArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueue DelayQueueSynchronousQueue 队列的介绍 Queue队列的基本概念与操作 在 …

使用html2canvas和jspdf导出pdf包含跨页以及页脚

首先要下载两个文件,一个为html2canvas.min.js,另一个是jspdf.umd.min.js这两个文件分别下载的地址我也附录上,都在官网git: html2canvas.min.js: https://html2canvas.hertzen.com/dist/html2canvas.min.js jspdf.umd.min.js: …

Docker 快速搭建 MongoDB 4.x 集群(一主一从)

目录 1. 生成 mongo-file2. 启动主节点3. 启动从节点4. 配置副本集5. 注意事项 环境:MongoDB 4.0.25,Alma Linux(建议使用 Linux) 部署的时候是在同一个及其上操作的,实际可以放在不同机器上。 截止到 2024年05月&…

OceanBase数据库诊断调优,与高可用架构——【DBA从入门到实践】第八期

在学习了《DBA从入门到实践》的前几期课程后,大家对OceanBase的安装部署、日常运维、数据迁移以及业务开发等方面应当已经有了全面的认识。若在实际应用中遇到任何疑问或挑战,欢迎您在OceanBase社区问答论坛中交流、讨论。此次,《DBA从入门到…

如何学到数据库从入门到入土(MySQL篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接…

以太坊现货ETF获批:引发ETH价格暴涨,市场热议达到高潮

2024年5月24日,北京时间,以太坊现货ETF正式获得美国证券交易委员会(SEC)的批准,成为继比特币之后,美国主权政府承认的又一加密货币基金产品。这一意外的利好消息引发了加密货币市场的狂欢,以太坊…

阳光电源临摹品引发的EMC正向设计思考

画画可以临摹。画电路板临摹的人更多。 抄板,抄的是过去的板子,容易出问题。现在市场竞争激烈,欧美客户对出口产品的标准要求推陈出新,防不胜防。由于市场的竞争,欧洲客户已经意识到EMC电磁兼容的重要性,不…

【PID算法详解】

PID算法 PID算法介绍用途pid数学表达式及其含义P算法D算法I算法 PID总结数学公式转换代码设计实际运用PID代码实现 PID算法介绍 PID控制器是一种广泛应用于工业控制系统的反馈控制器,它通过比例(Proportional)、积分(Integral&am…

LeetCode450删除二叉搜索树中的节点

题目描述 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤&#xff1…

合约的值类型

基本数据类型:整数、枚举、布尔(类似java的数据类型)Address、Contract(这两种是solidity特有的数据类型)Fixed byte array(定长字节数组) Integer(int/uint) int/uint 以8位字节递增&#xf…