Kafka Streams没有在countByKey之后写出预期的结果

时间:2016-11-30 06:00:33

标签: apache-kafka apache-kafka-streams

使用Kafka Streams(版本0.10.0.1)和Kafka Broker(0.10.0.1)我正在尝试根据消息密钥生成计数。我使用以下命令生成我的消息:

./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic kafka-streams-topic --property parse.key=true --property key.separator=,

当我运行上面的命令时,我可以发送一个键和值,如下所示:

1,{"value":10}

这将向kafka发送一条消息,该消息的密钥= 1且值= {“value”:10}。

我的目标是计算密钥= 1的消息数量。鉴于上述命令,计数将为1。

以下是我正在使用的代码:

public class StreamProcessor {

    public static void main(String[] args) {
        KStreamBuilder builder = new KStreamBuilder();

        final Serde<Long> longSerde = Serdes.Long();
        final Serde<String> stringSerde = Serdes.String();

        KStream<String, String> values = builder.stream(stringSerde, stringSerde, "kafka-streams-topic");

        KStream<String, Long> counts = values
                .countByKey(stringSerde, "valueCounts")
                .toStream();

        counts.print(stringSerde, longSerde);
        counts.to(stringSerde, longSerde, "message-counts-topic");

        KafkaStreams streams = new KafkaStreams(builder, properties());

        streams.start();

        Runtime.getRuntime().addShutdownHook(new Thread(streams::close));
    }

    private static Properties properties() {
        final Properties streamsConfiguration = new Properties();

        streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG, "kafka-streams-poc");
        streamsConfiguration.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        streamsConfiguration.put(StreamsConfig.ZOOKEEPER_CONNECT_CONFIG, "localhost:2181");
        streamsConfiguration.put(StreamsConfig.KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());
        streamsConfiguration.put(StreamsConfig.VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());

        return streamsConfiguration;
    }
}

当我运行counts.print(stringSerde,longSerde)时,我得到:

1 , 1

这意味着我有一个键= 1,并且它们是1个具有该键的消息。这就是我的期望。

但是,当以下行运行时:

counts.to(stringSerde, longSerde, "message-counts-topic");

名为message-counts-topic的主题会收到发送给它的消息,但是当我尝试使用此命令读取消息时:

./bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic message-counts-topic --property print.key=true --property key.separator=, --from-beginning

我得到以下输出:

1 , 

其中1是键,没有显示值。我希望看到消息1,1。但由于某种原因,计数值丢失,即使它在调用print方法时显示。

1 个答案:

答案 0 :(得分:4)

您需要为bin/kafka-console-consumer.sh指定不同的值反序列化器。添加以下内容:

--property value.deserializer=org.apache.kafka.common.serialization.LongDeserializer

默认字符串反序列化器无法正确读取长值。