一、kafka参数解析
一个消费者可以消费同一个topic的多个分区,但是一个分区不能被同一个组下的多个消费者消费。同一个组下有多个消费者并发消费同一个topic时,要注意设置的消费者并发个数一定要小于等于topic的分区数,不然会有空置的线程没有分区可以消费,并发的时候根据分区数和消费者的个数来分配每个消费者消费几个分区,消费者可以消费一个或多个分区。
#消费端自动提交
kafka.enable.auto.commit=true
#消费端与kafaka服务端的超时时间,消费端超过这个时间没有拉取数据的话,会被服务端剔除,服务端会把partions重新在消费中分配。
kafka.session.timeout=6000
#提交间隙
kafka.auto.commit.interval=100
#auto.offset.reset有常用的两种取值
#earliest 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
#latest 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据
当新加了分区时,此时如果消费端没有起来,当产生一定量的数据后,起了消费,这时如果用的latest,latest会从拉起的那一个开始消费后面的数据,前面的就丢失了,如果用的earliest会从头消费。
如果是新加了topic,但消费没起来,等产生了一定数据后,latest会从消费拉起的那刻起消费新产生的数据,earliest会重头消费。
如果每个topic都被消费过并且分区都提交了offert,则不管用latest还是earliest都会从上次提交的offert开始消费,所以会消费积压的数据。
kafka.auto.offset.reset=latest
#消费者并发个数,设置为几同一个消费组下就有几个消费者并发消费同一个topic,一个消费者就是一个线程。并发数要小于topic的分区数,避免有空线程无分区可消费。
每个消费者会拉起三个线程,ThreadPooltaskSchedule 控制消费者的定时任务,
kafka-coordinator-heartbeat-thread 消费者和服务端的心跳线程,
org.springframework.kafka.KafkaListenerEndpointContainer 消费者poll数据的线程。
kafka.concurrency=2
kafka.key.deserializer=org.apache.kafka.common.serialization.ByteArrayDeserializer
kafka.value.deserializer=org.apache.kafka.common.serialization.ByteArrayDeserializer
二、设置kafka的数据过期时间
修改kafka服务端的server.properties配置
log.retention.hours=72
log.cleanup.policy=delete
组与组间的消费者是没有关系的。
topic中已有分组消费数据,新建其他分组ID的消费者时,之前分组提交的offset对新建的分组消费不起作用。
四、Flink Kafka consumer的消费策略配置(可以指定消费起始位置)
FlinkKafkaConsumer011[String] consumer = new FlinkKafkaConsumer011[String]("hello", valueDeserializer, kafkaProps)
// 指定消费策略
consumer.setStartFromEarliest() // - 从最早的记录开始;
consumer.setStartFromLatest() //- 从最新记录开始;
consumer.setStartFromTimestamp(null); // 从指定的epoch时间戳(毫秒)开始;
consumer.setStartFromGroupOffsets(); // 默认行为,从上次消费的偏移量进行继续消费。