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