大数据技术高频面试题——kafka

目录

 

1.5 Kafka

1.5.1 Kafka架构

1.5.2 Kafka的机器数量

1.5.3 副本数设定

1.5.4 Kafka压测

1.5.5 Kafka日志保存时间

1.5.6 Kafka中数据量计算

1.5.7 Kafka的硬盘大小

1.5.8 Kafka监控

1.5.9 Kakfa分区数

1.5.10 多少个Topic

1.5.11 Kafka的ISR副本同步队列

1.5.12 Kafka分区分配策略

1.5.13 Kafka挂掉

1.5.14 Kafka丢不丢数据

1.5.15 Kafka数据重复

1.5.16 Kafka消息数据积压,Kafka消费能力不足怎么处理? 

1.5.17 Kafka参数优化

1.5.18 Kafka高效读写数据

1.5.19 Kafka单条日志传输大小

1.5.20 Kafka过期数据清理

1.5.21 Kafka可以按照时间消费数据

1.5.22 Kafka消费者角度考虑是拉取数据还是推送数据

1.5.23 Kafka中的数据是有序的吗


1.5 Kafka

1.5.1 Kafka架构

生产者、Broker、消费者、ZK;

注意:Zookeeper中保存Broker id和消费者offsets等信息,但是没有生产者信息。

 

1.5.2 Kafka的机器数量

Kafka机器数量=2*(峰值生产速度*副本数/100)+ 1

1.5.3 副本设定

一般我们设置成2个或3个,很多企业设置为2个

副本的优势:提高可靠性;副本劣势:增加了网络IO传输

1.5.4 Kafka压测

Kafka官方自带压力测试脚本(kafka-consumer-perf-test.sh、kafka-producer-perf-test.sh)。Kafka压测时,可以查看到哪个地方出现了瓶颈(CPU,内存,网络IO)。一般都是网络IO达到瓶颈

1.5.5 Kafka日志保存时间

默认保存7天;生产环境建议3天

1.5.6 Kafka中数据量计算

每天总数据量100g,每天产生1亿日志, 10000万/24/60/60=1150条/秒钟

平均每秒钟:1150

低谷钟:50

高峰每秒钟:1150*(2-20=2300条-23000条

每条日志大小0.5k-2k(取1k

每秒多少数据量:2.0M-20MB

1.5.7 Kafka的硬盘大小

每天的数据量100g*2个副本*3天/70%

1.5.8 Kafka监控

公司自己开发的监控器;

开源的监控器:KafkaManager、KafkaMonitorKafkaEagle

1.5.9 Kakfa分区数

1)创建一个只有1个分区的topic

2)测试这个topic的producer吞吐量和consumer吞吐量。

3)假设他们的值分别是Tp和Tc,单位可以是MB/s。

4)然后假设总的目标吞吐量是Tt,那么分区数=Tt / min(Tp,Tc)

例如:producer吞吐量=20m/s;consumer吞吐量=50m/s,期望吞吐量100m/s

分区数=100 / 20 =5分区

https://blog.csdn.net/weixin_42641909/article/details/89294698

分区数一般设置为:3-10

1.5.10 多少个Topic

通常情况:多少个日志类型就多少个Topic也有日志类型进行合并的。

1.5.11 Kafka的ISR副本同步队列

ISR(In-Sync Replicas),副本同步队列。ISR中包括Leader和Follower。如果Leader进程挂掉,会在ISR队列中选择一个服务作为新的Leader。有replica.lag.max.messages(延迟条数)和replica.lag.time.max.ms(延迟时间)两个参数决定一台服务是否可以加入ISR副本队列,在0.10版本移除了replica.lag.max.messages参数,防止服务频繁的进去队列。

任意一个维度超过阈值都会把Follower剔除出ISR,存入OSR(Outof-Sync Replicas)列表,新加入的Follower也会先存放在OSR中。

1.5.12 Kafka分区分配策略

在 Kafka内部存在两种默认的分区分配策略:Range和 RoundRobin。

Range是默认策略。Range是对每个Topic而言的(即一个Topic一个Topic分),首先对同一个Topic里面的分区按照序号进行排序,并对消费者按照字母顺序进行排序。然后用Partitions分区的个数除以消费者线程的总数来决定每个消费者线程消费几个分区。如果除不尽,那么前面几个消费者线程将会多消费一个分区。

例如我们有10个分区,两个消费者(C1,C2),3个消费者线程,10 / 3 = 3而且除不尽。

C1-0 将消费 0, 1, 2, 3 分区

C2-0 将消费 4, 5, 6 分区

C2-1 将消费 7, 8, 9 分区

第一步:将所有主题分区组成TopicAndPartition列表,然后对TopicAndPartition列表按照hashCode进行排序,最后按照轮询的方式发给每一个消费线程。

1.5.13 Kafka挂掉

1)Flume记录

2)日志有记录

3)短期没事

1.5.14 Kafka丢不丢数据

Ack=0,相当于异步发送,消息发送完毕即offset增加,继续生产。

Ack=1,leader收到leader replica 对一个消息的接受ack才增加offset,然后继续生产。

Ack=-1,leader收到所有replica 对一个消息的接受ack才增加offset,然后继续生产。

1.5.15 Kafka数据重复

幂等性 + ack-1 + 事务

Kafka数据重复,可以再下一级:SparkStreamingredis或者hive中dwd层去重去重的手段:分组、按照id开窗只取第一个值;

1.5.16 Kafka消息数据积压,Kafka消费能力不足怎么处理? 

1如果是Kafka消费能力不足,则可以考虑增加Topic的分区数,并且同时提升消费组的消费者数量,消费者数=分区数。(两者缺一不可)

2)如果是下游的数据处理不及时:提高每批次拉取的数量。批次拉取数据过少(拉取数据/处理时间<生产速度),使处理的数据小于生产的数据,也会造成数据积压。

1.5.17 Kafka参数优化

1)Broker参数配置(server.properties

1、日志保留策略配置

# 保留三天,也可以更短 (log.cleaner.delete.retention.ms)

log.retention.hours=72

 

2、Replica相关配置

default.replication.factor:1 默认副本1

 

3、网络通信延时

replica.socket.timeout.ms:30000 #当集群之间网络不稳定时,调大该参数

replica.lag.time.max.ms= 600000# 如果网络不好,或者kafka集群压力较大,会出现副本丢失,然后会频繁复制副本,导致集群压力更大,此时可以调大该参数

2)Producer优化(producer.properties

compression.type:none                 gzip  snappy  lz4  

#默认发送不进行压缩,推荐配置一种适合的压缩算法,可以大幅度的减缓网络压力和Broker的存储压力。

3Kafka内存调整(kafka-server-start.sh

默认内存1个G生产环境尽量不要超过6个G。

export KAFKA_HEAP_OPTS="-Xms4g -Xmx4g"

1.5.18 Kafka高效读写数据

1Kafka本身是分布式集群,同时采用分区技术,并发度高。

2)顺序写磁盘

Kafka的producer生产数据,要写入到log文件中,写的过程是一直追加到文件末端,为顺序写。官网有数据表明,同样的磁盘,顺序写能到600M/s,而随机写只有100K/s。

3)零复制技术

 

1.5.19 Kafka单条日志传输大小

kafka对于消息体的大小默认为单条最大值是1M但是在我们应用场景中, 常常会出现一条消息大于1M,如果不对kafka进行配置。则会出现生产者无法将消息推送到kafka或消费者无法去消费kafka里面的数据, 这时我们就要对kafka进行以下配置:server.properties

replica.fetch.max.bytes: 1048576  broker可复制的消息的最大字节数, 默认为1M

message.max.bytes: 1000012   kafka 会接收单个消息size的最大限制, 默认为1M左右

注意:message.max.bytes必须小于等于replica.fetch.max.bytes,否则就会导致replica之间数据同步失败。

1.5.20 Kafka过期数据清理

保证数据没有被引用(没人消费他)

日志清理保存的策略只有delete和compact两种

log.cleanup.policy=delete启用删除策略

log.cleanup.policy=compact启用压缩策略

https://www.jianshu.com/p/fa6adeae8eb5

1.5.21 Kafka可以按照时间消费数据

Map<TopicPartition, OffsetAndTimestamp> startOffsetMap = KafkaUtil.fetchOffsetsWithTimestamp(topic, sTime, kafkaProp);

1.5.22 Kafka消费者角度考虑是拉取数据还是推送数据

拉取数据

1.5.23 Kafka中的数据是有序的吗

单分区内有序;多分区,分区与分区间无序;

扩展:

kafka producer发送消息的时候,可以指定key:

 

这个key的作用是为消息选择存储分区,key可以为空,当指定key且不为空的时候,kafka是根据key的hash值与分区数取模来决定数据存储到那个分区

 

有序解决方案:同一张表的数据 放到 同一个 分区

=> ProducerRecord里传入key,会根据key取hash算出分区号

=> key使用表名,如果有库名,拼接上库名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值