shartoo +

大数据:kafka常见问题

本文总阅读量
欢迎star我的博客

一 kafka如何处理消费过的数据

1.1 如果想消费已经被消费过的数据

1.2 如何自定义去消费已经消费过的数据

1.2.1 Conosumer.properties配置文件中有两个重要参数:

1.2.2 如何使用SimpleConsumer

参考1
参考2
完整代码

2 kafka partition和consumer数目关系

  1. 如果consumer比partition多,是浪费,因为kafka的设计是在一个partition上是不允许并发的,所以consumer数不要大于partition数 。
  2. 如果consumer比partition少,一个consumer会对应于多个partitions,这里主要合理分配consumer数和partition数,否则会导致partition里面的数据被取的不均匀 。最好partiton数目是consumer数目的整数倍,所以partition数目很重要,比如取24,就很容易设定consumer数目 。
  3. 如果consumer从多个partition读到数据,不保证数据间的顺序性,kafka只保证在一个partition上数据是有序的,但多个partition,根据你读的顺序会有不同
  4. 增减consumer,broker,partition会导致rebalance,所以rebalance后consumer对应的partition会发生变化

详见

3 kafka副本问题

kafka尽量将所有的Partition均匀分配到整个集群上。一个典型的部署方式是一个Topic的Partition数量大于Broker的数量。

3.1 如何分配副本

Producer在发布消息到某个Partition时,先通过ZooKeeper找到该Partition的Leader,然后无论该Topic的Replication Factor为多少(也即该Partition有多少个Replica),Producer只将该消息发送到该Partition的Leader。Leader会将该消息写入其本地Log。每个Follower都从Leader pull数据。这种方式上,Follower存储的数据顺序与Leader保持一致.

3.2 Kafka分配Replica的算法如下

1.将所有Broker(假设共n个Broker)和待分配的Partition排序.

  1. 将第i个Partition分配到第(i mod n)个Broker上.
  2. 将第i个Partition的第j个Replica分配到第((i + j) mode n)个Broker上.

算法详细

4 kafka如何设置生存周期与清理数据

日志文件的删除策略非常简单:启动一个后台线程定期扫描log file列表,把保存时间超过阀值的文件直接删除(根据文件的创建时间).清理参数在server.properties文件中:
详见官网说明

5 zookeeper如何管理kafka

  1. Producer端使用zookeeper用来”发现”broker列表,以及和Topic下每个partition leader建立socket连接并发送消息.
  2. Broker端使用zookeeper用来注册broker信息,以及监测partition leader存活性.
  3. Consumer端使用zookeeper用来注册consumer信息,其中包括consumer消费的partition列表等,同时也用来发现broker列表,并和partition leader建立socket连接,并获取消息.

6 补充问题,kafka能否自动创建topics

producer.properties配置文件中的一个参数:auto.create.topics.enable=true
是否自动创建
如果broker中没有topic的信息,当producer/consumer操作topic时,是否自动创建.
如果为false,则只能通过API或者command创建topic

我的博客

观点

源码