Kafka Streams API:意外延迟消耗第一个事件

时间:2017-04-10 19:32:03

标签: apache-spark spark-streaming

我有一个简单的Kafka制作人将事件发送到kafka(0.10.2.0)主题(" my_kafka_topic")。使用kafka-console-consumer

读取这些事件需要<10毫秒
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic my_kafka_topic

但是,我还有一个非常简单的Kafka Streams应用程序,它从同一主题读取事件并将它们写入另一个主题(&#34; my_kafka_topic_out&#34;)。在这个应用程序中,从同一个源主题开始接收事件需要大约2-4分钟(不确定)。

KStreamBuilder builder = new KStreamBuilder();
KStream<String, String> stream = builder.stream("my_kafka_topic");
stream.to("my_kafka_topic_out");

Properties props = new Properties();
props.put(StreamsConfig.APPLICATION_ID_CONFIG, "steams-appid");
props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
props.put(StreamsConfig.KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());
props.put(StreamsConfig.VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());
props.put(StreamsConfig.TIMESTAMP_EXTRACTOR_CLASS_CONFIG, WallclockTimestampExtractor.class.getName());

KafkaStreams streams = new KafkaStreams(builder, props);
streams.start();

一旦开始接收事件,一切都按预期工作。 Everything(kafka,zookeeper,kafka streams app)在localhost中运行。可能是什么问题?是否有任何配置参数我可以调整以减少延迟,因此Kafka流应用程序开始接收事件的速度与控制台消费者一样快?

修改

如果我设置此配置参数(感谢@vmg),显然没有延迟,但我仍然不明白为什么或是否合适的值。

props.put(ConsumerConfig.METADATA_MAX_AGE_CONFIG, 5000);

1 个答案:

答案 0 :(得分:0)

感谢您的更新。

在我的环境中也出现了类似的问题,我通过在Kafka流启动之前创建主题而不是设置

来解决

ConsumerConfig.METADATA_MAX_AGE_CONFIG

您是否在启动应用之前创建了主题?

docs中,ConsumerConfig.METADATA_MAX_AGE_CONFIG就是那个

  

我们强制刷新元数据的时间段(以毫秒为单位),即使我们没有看到任何分区领导层更改以主动发现任何新的代理或分区。

所以我猜Kafka Streams应用程序无法在启动时获取包含有关目标主题(以及关系管理员)的infomaintion的元数据。

经过METADATA MAX_AGE CONFIG(default 30000)秒后,Kafka Streams应用程序刷新元数据,之后,新元数据包含有关主题的信息,并且第一次知道目标主题已创建的应用程序。< / p>

换句话说,如果我在启动Kafka Streams应用程序之前创建主题,则应用程序可以在启动时获取包含目标主题的元数据。我无需等待METADATA MAX_AGE CONFIG秒。