我正在构建一个简单的k-stream应用程序,它将现有主题的数据流式传输到另一个主题。
我的制作人streaming meetup's open data指的是一个名为test
的主题,我想将其处理为testout
主题
以下是代码:
package com.mycompany.app;
import org.apache.kafka.common.serialization.Serdes;
import org.apache.kafka.streams.KafkaStreams;
import org.apache.kafka.streams.StreamsConfig;
import org.apache.kafka.streams.kstream.KStreamBuilder;
import java.util.Properties;
public class App {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
props.put(StreamsConfig.APPLICATION_ID_CONFIG, "my-first-streams-application");
props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
props.put(StreamsConfig.ZOOKEEPER_CONNECT_CONFIG, "localhost:2181");
props.put(StreamsConfig.KEY_SERDE_CLASS_CONFIG, Serdes.ByteArray().getClass().getName());
props.put(StreamsConfig.VALUE_SERDE_CLASS_CONFIG, Serdes.ByteArray().getClass().getName());
props.put(StreamsConfig.NUM_STREAM_THREADS_CONFIG, 10);
KStreamBuilder builder = new KStreamBuilder();
builder.stream("test").to("testout");;
KafkaStreams streams = new KafkaStreams(builder, props);
streams.start();
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
streams.close();
}
}));
}
}
但是,当我用:
运行应用程序时java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App
我得到了这个例外:
Exception in thread "StreamThread-1" java.lang.IllegalArgumentException: Invalid timestamp -1
at org.apache.kafka.clients.producer.ProducerRecord.<init>(ProducerRecord.java:60)
at org.apache.kafka.streams.processor.internals.SinkNode.process(SinkNode.java:72)
at org.apache.kafka.streams.processor.internals.StreamTask.forward(StreamTask.java:338)
at org.apache.kafka.streams.processor.internals.ProcessorContextImpl.forward(ProcessorContextImpl.java:187)
at org.apache.kafka.streams.processor.internals.SourceNode.process(SourceNode.java:64)
at org.apache.kafka.streams.processor.internals.StreamTask.process(StreamTask.java:174)
at org.apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.java:320)
at org.apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.java:218)
我一直在寻找这么久,我仍然无法找到我收到此错误的原因。
有什么想法吗?
答案 0 :(得分:0)
来自:http://docs.confluent.io/3.1.0/streams/faq.html#invalid-timestamp-exception
此错误表示Kafka Streams应用程序的时间戳提取程序无法从记录中提取有效的时间戳。通常,这指示记录存在问题(例如,记录根本不包含时间戳),但它也可能表示应用程序使用的时间戳提取器中存在问题或错误。
记录何时不包含有效时间戳:
- 如果您使用默认的ConsumerRecordTimestampExtractor,则很可能您的记录没有嵌入时间戳(嵌入式记录时间戳以Kafka的消息格式在Kafka 0.10中引入)。例如,如果您使用由旧Kafka生产者客户端(即0.9或更早版本)或第三方生产者客户端编写的主题,则可能会发生这种情况。可能发生这种情况的另一种情况是将Kafka集群从0.9升级到0.10,其中使用0.9生成的所有数据都不包含0.10消息时间戳。
- 如果您使用的是自定义时间戳提取程序,请确保提取程序正确处理无效(负)时间戳,其中“正确”取决于应用程序的语义。例如,如果无法提取有效时间戳(可能缺少数据中的时间戳字段),则可以返回默认值或估计时间戳。
- 您还可以通过WallclockTimestampExtractor切换到处理时语义;这种后备是否适合这种情况取决于你的用例。 但是,作为第一步,您应该确定并解决为什么首先将这些有问题的记录写入Kafka的根本原因。在第二步中,您可以考虑在处理此类记录时应用变通方法(如上所述)(例如,如果您需要处理这些记录)。另一种选择是使用正确的时间戳重新生成记录,并将它们写入新的Kafka主题。