kafka-spout在拉取数据的时候,offset超出了范围
78591927 [Thread-17-spout] WARN storm.kafka.PartitionManager - Using new offset: 686146
78591927 [Thread-15-spout] WARN storm.kafka.KafkaUtils - Got fetch request with offset out of range: [349915]; retrying with default start offset time from configuration. configured start offset time: [-2]
网上说的最多的解决办法
1.修改SpoutConfig.zkRoot 值
String zkRoot = “”;
SpoutConfig spoutConf = new SpoutConfig(hosts, topic, zkRoot, id);
2.将spoutConf.forceFromStart 设为 true;
原因:
storm启动的时候,默认是从头读取-2,当kafkaspout的task出错时候,会重新启动,这时候offset就会从zk中最老的offset,但kafka数据只会保存一段时间,从zk中读取道德offset的数据可能已经不存在,超过现在的范围。
kafkaspout读取的3种选项
-2: 从最老的开始读
-1: 从最近的开始读
0: 从Zk中读
在自己的亲自试验中上面的解决办法并没有作用,而且-2,-1, 0不知道在哪里设置
在GitHub上面看见较多的办法,这是kafka自身的问题,需要自己修改源码,在storm-kafka的文件中有PartitionManager类,在此类中有一个private void fill()方法,修改此方法中的
try {
msgs = KafkaUtils.fetchMessages(this._spoutConfig, this._consumer, this._partition, offset);
} catch (UpdateOffsetException var15) { this._emittedToOffset = Long.valueOf(KafkaUtils.getOffset(this._consumer, this._spoutConfig.topic, this._partition.partition, this._spoutConfig));
LOG.warn("Using new offset: {}", this._emittedToOffset);
return;
}
在return之前添加
if (had_failed) {
failed.remove(offset);
}