1.Rebalance 的触发条件有3个。
- 组成员个数发生变化。例如有新的 consumer 实例加入该消费组或者离开组
- 订阅的 Topic 个数发生变化
- 订阅的 Topic 的分区数发生变化
2. 问题排查
问题一:使用的spark streaming消费kafka,batch interval设置为30s和180时,没有出现问题。当设置到300s后,发现streaming每隔300s都会进行一次rebalance
原因:max.poll.interval.ms 设置问题。
max.poll.interval.ms是设置consumer每次拉去间隔时长,默认300s。
也是说,consumer两次提交offset的间隔不能大于300s,如果大于这个值,kafka会在300s到达时,直接进行Rebalance。
解决办法:修改max.poll.interval.ms值为600s
问题二:多个spark streaming程序,每个消费不同topic,当有streaming程序重启后,其中的kafka consumer没有立马消费数据,而是等待几分钟后才会入组,然后开始消费数据
问题原因:不同的streaming程序中的kafka 共用了一个group id。
启动streaming程序后,consumer 要入组,但是consumerGroup并不会立刻进行Rebalance,而是等组内的其他消费组提交一次offset后,再一起进行Rebalance。
解决方法:不同的streaming程序,使用不同的group id
3. 补充:
1. 实际工作中,为了保证kafka消费的稳定性,一般会适当修改以下参数
request.timeout.ms 60 * 1000 * 4
max.poll.interval.ms 60 * 1000 * 6
session.timeout.ms 60 * 1000 * 3
heartbeat.interval.ms 60 * 1000 * 2
2. spark streaming中offset提交时机
spark streaming中的consumer提交offset的间隔,其实是固定的,即batch interval。
例如batch interval为300s,但数据处理在10s时就处理完成了,但steaming会等到300s时,再提交偏移量。
同样,当处理时间大于batch interval,kafka也会在3
00s时进行一次offset的提交,只不过此时提交的offset是拉取的开始值。
所以,对于spark streaming来说,不需要担心处理时间过短和无限长的问题,只要保证batch interval 小于 max.poll.interval.ms即可。