第五天补充 -- Kafka常见问题

第五天补充 – Kafka常见问题

一、如何消费已被消费过的数据

​ consumer底层采用的是一个阻塞队列,只要一有producer生产数据,那么consumer就会将数据消费。这将会产生一个严重的问题,如果重启了消费者程序,那么将会一条数据都抓不到,但是log文件中却可以看见所有的数据都存在。换言之,一旦消费过这些数据,那么将无法再次用同一个groupid消费同一组数据了。

​ 原因:消费者消费了的数据不会从队列中移除,只是记录了offset偏移量。同一个consumergroup的所有consumer合起来消费一个topic,并且他们每次消费的时候都会保存一个offset参数在zookeeper的root上。如果此时某个consumer挂了或者新增一个consumer进程,将会触发kafka的负载均衡,暂时性地重启所有consumer,重新分配哪个consumer去消费哪个partition,然后再继续通过保存在zookeeper上的offset参数继续读取数据。注意:offset保存的是consumer组消费的消息偏移。

​ 如果要消费同一组数据,可以采取以下两种操作:

​ 1. 采用不同的group

​ 2. 通过一些配置,就可以将线上产生的数据同步到镜像中去,然后再由特定的集群去处理大批量的数据。

1543209281199

二、如何自定义消费已经消费过的数据

​ 在Consumer.properties配置文件中有两个重要参数:

​ auto.commit.enable:如果为true,则consumer的消费偏移offset会被记录到zookeeper,下次consumer启动时会从此位置继续消费。

​ auto.offset.reset:该参数可以接受两个值largest和smallest,分别表示当前offset指到日志文件的最开始位置和最近的位置。

​ 如果进一步向控制时间,则需要调用SimpleConsumer,设置相关参数。其中比较重要的参数是kafka.api.OffsetResquest.EarliestTime()和kafka.api.OffsetRequest.LatestTime()分别表示从日志(数据)的开始位置和只读取最新日志。

​ 要使用SimpleConsumer,首先必须知道读取哪个topic的哪个partition;然后,找到负责该partition的broker leader,从而找到存有该partition副本的那个broker;再者,自己去写request并fetch数据;最后,还要注意需要识别和处理brokerleader的改变。

三、Kafka partition和consumer的数目关系

  1. 如果consumer比partition多,是浪费,因为kafka的设计在一个partition上不允许并发,所以consumer数不要大于partition数。

  2. 如果consumser比partition少,一个consumer会对应于多个partitions,这里需要合理分配consumer数和partition数,否则会导致partition里面的数据被取得不均匀。最好partition数目是consumer数目的整数倍,所以partition数目很重要。

  3. 如果consumer从多个partition读到数据,不能保证数据间的顺序性,kafka只保证在一个partition上数据是有序的,但多个partition,根据读取的顺序会不同。

  4. 增减consumer、broker、partition会导致rebalance,所以rebalance后consumer对应的partition会发生变化。

四、Kafka topic副本问题

​ Kafka尽量将所有的partition均匀分配到整个集群上,一个典型的部署方式是一个topic的partition数量大于broker的数量

  1. 如何分配副本:

    producer在发布消息到某个partition时,先通过zookeeper找到该partition的leader,然后无论该topic的replication factor(副本数)为多少,producer只将该消息发送到该partition的leader,leader会将该消息写入到本地log。每个follower都从leader pull数据。这种方式上,follower存储的数据顺序与leader保持一致。

  2. kafka分配replica的算法如下:

    将所有breker(假设有n个)和待分配的partition排序

    将第i个partition分配到第(i mod n)个broker上

    将第i个partition的第j个replica分配到第((i + j) mod n)个broker上

五、Kafka如何设置生存周期与清理数据

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

1543310298614

六、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连接,并获取消息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值