经过2天的折腾,总算是解决了这个问题。
1.最开始遇到这个问题,总结为网络原因,可能确实是网络原因,但是需要解决。因此希望调大session.timeout,但是服务端没有设置,导致客户端无法调超过30s,所以没法调高超时时间等。而且感觉这个治标不治本!
2.尝试调低一次拉取的最大值,从而减少一次处理的条数。确实有收益,但是还需要继续!
3.尝试发现处理一条数据过程中耗时最久的一步,优化之。这次找到源头所在,处理逻辑中有一步是HTTP请求,这步有一些耗时25ms(batch commit?),当一次消费3W条数据(fetch size :5M),这步就非常耗时,并且某些时候可能会有网络原因导致阻塞?所以就导致了整个poll循环出现本文的问题。发现方法:注释掉sendKafka().解决方法:sendKafka()改为异步处理,send()只是put in memory BlockQueue。
这次基本算是解决了问题。另外中途遇到了:faild allocate memory within max.bolck.ms
解决:
batch.size 1024 -> 10240
max.block.ms 1000不变
buffer.memory 4096 -> 40960
总结:这个问题是必然报出来的,因为确实不该在poll循环里面做非常耗时的、不稳定的逻辑.一定要注意一切有关网络开销、数据库等的。
附.消费者配置
"bootstrap.servers">${kafka.event.host}
"retries">${metric.report.kafka.retries:3}
"batch.size">${metric.report.kafka.batch.size:10240}
"max.block.ms">${metric.report.kafka.max.block.ms:1000}
"linger.ms">${metric.report.kafka.linger.ms:100}
"buffer.memory">${metric.report.kafka.buffer.memory:40960}
"key.serializer">org.apache.kafka.common.serialization.StringSerializer
"value.serializer">org.apache.kafka.common.serialization.StringSerializer
本地跑消费kafka数据,发现ERROR,网上找到这个哥们的:
http://stackoverflow.com/questions/38394662/error-unknown-member-id-occurred-while-committing-offsets-for-group-xxx
https://cwiki.apache.org/confluence/display/KAFKA/KIP-41%3A+KafkaConsumer+Max+Records
大概意思就是说消费不过来,数据太大。自动commit超时了。
解决:
准备改的时候,想了一想,先看看我这程序能处理多少,结果一跑起来才发现,压根不是程序的锅。本地网络波动导致的!因为这个线程没用到redis,但是这个异常每次都和redis timeout一起报,
我设置的 poll(100 ms). max.partition.fetch.bytes没设置,默认1M,
然后打印了消费5000条数据情况下耗时,是1s。所以白担心了一场,不过也学到了一些东西。
遇到错不一定就是程序的锅。其他环境、引用都有可能导致ERROR!!!
kafka客户端性能优化参考:
http://www.jianshu.com/p/4e00dff97f39
今天部署到服务器又报这个异常,
2017-05-12 11:17:07,553 [pool-1-thread-1] WARN org.apache.kafka.clients.consumer.internals.ConsumerCoordinator:445 - Auto offset commit failed:
2017-05-12 11:17:07,554 [pool-1-thread-1] INFO org.apache.kafka.clients.consumer.internals.AbstractCoordinator:354 - Attempt to join group alert failed due to unknown member id, resetti
ng and retrying.
2017-05-15 02:03:23,737 [pool-1-thread-1] INFO org.apache.kafka.clients.consumer.internals.AbstractCoordinator:623 - Attempt to heart beat failed since the group is rebalancing, try to
re-join group.
2017-05-15 02:03:49,150 [pool-1-thread-1] INFO org.apache.kafka.clients.consumer.internals.AbstractCoordinator:623 - Attempt to heart beat failed since the group is rebalancing, try to
re-join group.
2017-05-15 02:05:09,154 [pool-1-thread-1] INFO org.apache.kafka.clients.consumer.internals.AbstractCoordinator:623 - Attempt to heart beat failed since the group is rebalancing, try to
看来确实在某些时刻,程序无法消费过来,调高一下心跳时间试试:
heartbeat.interval.ms 25000 》 60000
参考文章:
http://blog.csdn.net/xianzhen376/article/details/51802736
Kafka源码深度解析-序列7 -Consumer -coordinator协议与heartbeat实现原理
http://blog.csdn.net/chunlongyu/article/details/52791874
http://blog.csdn.net/stark_summer/article/details/50203133