-
jstorm一直刷如下错误消息:
115:43:07.952 [kafka:5-SingleThreadSpoutExecutors] WARN storm.kafka.KafkaUtils - Got fetch request with offset out of range: [22]; retrying with default start offset time from configuration. configured start offset time: [-2] 215:43:07.955 [kafka:5-SingleThreadSpoutExecutors] WARN storm.kafka.PartitionManager - Using new offset: 23 -
原因如下:
- kafka有定时清空数据,或者消息丢失。
- jstorm的代码里面有fail的逻辑,消息正好failed。
- faild的消息正好被kafka清空或者丢失了。
如果上面条件都满足,则会一直循环包如上的错误消息。
-
storm-kakfa对应代码如下:
1// Are there failed tuples? If so, fetch those first. 2if (had_failed) { 3 offset = failed.first(); 4} else { 5 offset = _emittedToOffset; 6} 7ByteBufferMessageSet msgs = null; 8try { 9 msgs = KafkaUtils.fetchMessages(_spoutConfig, _consumer, _partition, offset); 10} catch (UpdateOffsetException e) { 11 _emittedToOffset = KafkaUtils.getOffset(_consumer, _spoutConfig.topic, _partition.partition, _spoutConfig); 12 LOG.warn("Using new offset: {}", _emittedToOffset); 13 // fetch failed, so don't update the metrics 14 return; 15}
因为在jstorm bolt中有失败的消息,所以had_failed=true,所以一直从failed列表里消费第一条数据,而failed列表里的第一条数据又被kafka清空了,导致一直抛出UpdateOffsetException,然后返回又重新循环一遍,所以就会一直出现一开始的错误。