Kafka笔记

Kafka笔记

1.Kafka名词解释和工作方式

  1. Producer :消息生产者,就是向kafka broker发消息的客户端。
  2. Consumer :消息消费者,向kafka broker取消息的客户端
  3. Topic :咋们可以理解为一个队列。
  4. Consumer Group (CG):这是kafka用来实现一个topic消息的广播(发给所有的consumer)和单播(发给任意一个consumer)的手段。一个topic可以有多个CG。topic的消息会复制(不是真的复制,是概念上的)到所有的CG,但每个partion只会把消息发给该CG中的一个consumer。如果需要实现广播,只要每个consumer有一个独立的CG就可以了。要实现单播只要所有的consumer在同一个CG。用CG还可以将consumer进行自由的分组而不需要多次发送消息到不同的topic。
  5. Broker :一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic
  6. Partition:为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序。
  7. Offset:kafka的存储文件都是按照offset.kafka来命名,用offset做名字的好处是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可。当然the first offset就是00000000000.kafka

2.Consumer与topic关系

本质上kafka只支持Topic;

每个group中可以有多个consumer,每个consumer属于一个consumer group;

通常情况下,一个group中会包含多个consumer,这样不仅可以提高topic中消息的并发消费能力,而且还能提高”故障容错”性,如果group中的某个consumer失效那么其消费的partitions将会有其他consumer自动接管。

对于Topic中的一条特定的消息,只会被订阅此Topic的每个group中的其中一个consumer消费,此消息不会发送给一个group的多个consumer;

那么一个group中所有的consumer将会交错的消费整个Topic,每个group中consumer消息消费互相独立,我们可以认为一个group是一个”订阅”者。

在kafka中,一个partition中的消息只会被group中的一个consumer消费(同一时刻);

一个Topic中的每个partions,只会被一个”订阅者”中的一个consumer消费,不过一个consumer可以同时消费多个partitions中的消息。

kafka的设计原理决定,对于一个topic,同一个group中不能有多于partitions个数的consumer同时消费,否则将意味着某些consumer将无法得到消息。

kafka只能保证一个partition中的消息被某个consumer消费时是顺序的;事实上,从Topic角度来说,当有多个partitions时,消息仍不是全局有序的。

3.kafka中生产数据的时候,如何保证写入的容错性?

设置发送数据是否需要服务端的反馈,有三个值0,1,-1

0: producer不会等待broker发送ack

1: 当leader接收到消息之后发送ack

-1: 当所有的follower都同步消息成功后发送ack

request.required.acks=0

4.如何保证kafka消费者消费数据是全局有序的

伪命题

每个分区内,每条消息都有一个offset,故只能保证分区内有序。

如果要全局有序的,必须保证生产有序,存储有序,消费有序。

由于生产可以做集群,存储可以分片,消费可以设置为一个consumerGroup,要保证全局有序,就需要保证每个环节都有序。

只有一个可能,就是一个生产者,一个partition,一个消费者。这种场景和大数据应用场景相悖。

5.有两个数据源,一个记录的是广告投放给用户的日志,一个记录用户访问日志,另外还有一个固定的用户基础表记录用户基本信息(比如学历,年龄等等)。现在要分析广告投放对与哪类用户更有效,请采用熟悉的技术描述解决思路。另外如果两个数据源都是实时数据源(比如来自kafka),他们数据在时间上相差5分钟,需要哪些调整来解决实时分析问题?

6.Kafka和Spark Streaming如何集成?

两种方式:

1.Direct

2.Receiver

7.列举Kafka的优点,简述Kafka为什么可以做到每秒数十万甚至上百万消息的高效分发?

1、页缓存技术 + 磁盘顺序写

2、零拷贝技术

8.为什么离线分析要用kafka?

Kafka的作用是解耦,如果直接从日志服务器上采集的话,实时离线都要采集,等于要采集两份数据,而使用了kafka的话,只需要从日志服务器上采集一份数据,然后在kafka中使用不同的两个组读取就行了

9.Kafka怎么进行监控?

Kafka Manager

10.Kafka与传统的消息队列服务有什么不同

  • 较长时间持久化
  • 高性能(7种的有点)

11.Kafka api low-level与high-level有什么区别,使用low-level需要处理哪些细节

High Level Consumer API

  1. High Level Consumer API围绕着Consumer Group这个逻辑概念展开,它屏蔽了每个Topic的每个Partition的Offset管理(自动读取zookeeper中该Consumer group的last offset )、Broker失败转移以及增减Partition、Consumer时的负载均衡(当Partition和Consumer增减时,Kafka自动进行负载均衡)
  2. 对于多个Partition,多个Consumer,如果consumer比partition多,是浪费,因为kafka的设计是在一个partition上是不允许并发的,所以consumer数不要大于partition数;
  3. 如果consumer比partition少,一个consumer会对应于多个partitions,这里主要合理分配consumer数和partition数,否则会导致partition里面的数据被取的不均匀。最好partiton数目是consumer数目的整数倍,所以partition数目很重要,比如取24,就很容易设定consumer数目
  4. 如果consumer从多个partition读到数据,不保证数据间的顺序性,kafka只保证在一个partition上数据是有序的,但多个partition,根据你读的顺序会有不同
  5. 增减consumer,broker,partition会导致rebalance,所以rebalance后consumer对应的partition会发生变化

Low Level Consumer API

  1. Low Level Consumer API控制灵活性
    Low Level Consumer API,作为底层的Consumer API,提供了消费Kafka Message更大的控制,如:
    Read a message multiple times(重复读取)
    Consume only a subset of the partitions in a topic in a process(跳读)
    Manage transactions to make sure a message is processed once and only once(Exactly Once原语)

  2. Low Level Consumer API的复杂性
    软件没有银弹,Low Level Consumer API提供更大灵活控制是以复杂性为代价的:
    Offset不再透明
    Broker自动失败转移需要处理
    增加Consumer、Partition、Broker需要自己做负载均衡

12.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中。

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

  1. 如果是Kafka消费能力不足,则可以考虑增加Topic的分区数,并且同时提升消费组的消费者数量,消费者数=分区数。(两者缺一不可)
  2. 如果是下游的数据处理不及时:提高每批次拉取的数量。批次拉取数据过少(拉取数据/处理时间<生产速度),使处理的数据小于生产的数据,也会造成数据积压。

14.Kafka中的ISR、AR又代表什么?

ISR:in-sync replica set (ISR),与leader保持同步的follower集合

AR:分区的所有副本

15.Kafka中的HW、LEO等分别代表什么?

LEO:每个副本的最后那条消息的offset

HW:一个分区中所有副本最小的offset

16.哪些情景会造成消息漏消费?

两种情况可能出现重复消费

  1. 当ack=-1时,如果在follower同步完成后,broker发送ack之前,leader发生故障,导致没有返回ack给Producer,由于失败重试机制,又会给新选举出来的leader发送数据,造成数据重复。

  2. (手动管理offset时,先消费后提交offset)消费者消费后没有commit offset(程序崩溃/强行kill/消费耗时/自动提交偏移情况下unscrible)

三种情况可能出现漏消费

  1. (手动管理offset时,先提交offset后消费)先提交offset,后消费,有可能造成数据的漏消费

    如果先提交offset,后消费,可能会出现数据漏消费问题。比如,要消费0,1,2,我先提交offset ,此时consumer_offsets的值为4,但等我提交完offset之后,还没有消费之前,消费者挂掉了,这时等消费者重新活过来后,读取的consumer_offsets值为4,就会从4开始消费,导致消息0,1,2出现漏消费问题。

  2. 当ack=0时,producer不等待broker的ack,这一操作提供了一个最低的延迟,broker一接收到还没有写入磁盘就已经返回,当broker故障时有可能丢失数据;

  3. 当ack=1时,producer等待broker的ack,partition的leader落盘成功后返回ack,如果在follower同步成功之前leader故障,而由于已经返回了ack,系统默认新选举的leader已经有了数据,从而不会进行失败重试,那么将会丢失数据

17.当你使用kafka-topics.sh创建了一个topic之后,Kafka背后会执行什么逻辑?

  1. 会在zookeeper中的/brokers/topics节点下创建一个新的topic节点,如:/brokers/topics/first
  2. 触发Controller的监听程序
  3. kafka Controller 负责topic的创建工作,并更新metadata cache

18.topic的分区数可不可以增加?如果可以怎么增加?如果不可以,那又是为什么?

可以增加

bin/kafka-topics.sh –zookeeper localhost:2181/kafka –alter –topic topic-config –partitions 3

19.topic的分区数可不可以减少?如果可以怎么减少?如果不可以,那又是为什么?

不可以减少,被删除的分区数据难以处理。

20.Kafka有内部的topic吗?如果有是什么?有什么所用?

__consumer_offsets,保存消费者offset

21.聊一聊Kafka Controller的作用?

负责管理集群broker的上下线,所有topic的分区副本分配和leader选举等工作。

22.失效副本是指什么?有那些应对措施?

不能及时与leader同步,暂时踢出ISR,等其追上leader之后再重新加入