我有一个简单的Flink单词计数,它从Kafka主题读取,并将其结果输出到另一个Kafka主题
DataStream<String> input = env.addSource(new FlinkKafkaConsumer<>(inputTopic, new SimpleStringSchema(), props));
DataStream<Tuple2<String, Long>> counts = ......;
counts.addSink(new FlinkKafkaProducer<>(outputTopic, new WordCountSerializer(), props));
//counts.print();
env.execute("foobar");
问题是,我通过kafka-console-consumer.sh命令行在输出主题中看不到任何东西。
为解决此问题,我尝试打印结果,并且工作正常,我可以在日志文件中看到正确的工作计数结果。
因此,猜测是WordCountSerializer中出现问题,例如
class WordCountSerializer implements KeyedSerializationSchema<Tuple2<String, Long>>, java.io.Serializable {
public byte[] serializeKey(Tuple2<String, Long> element) {
return new StringSerializer().serialize(null, element.getField(0));
}
public byte[] serializeValue(Tuple2<String, Long> element) {
return new LongSerializer().serialize(null, element.getField(1));
}
public String getTargetTopic(Tuple2<String, Long> element) {
return null;
}
}
将 serializeValue 更改为
public byte[] serializeValue(Tuple2<String, Long> element) {
return new StringSerializer().serialize(null, element.getField(1).toString());
}
我可以看到计数已输出到Kafka(元组的单词部分仍然缺失),例如
1
3
...
我的问题是
在如上所述更改了serializeValue方法之后,它部分起作用,但是我真正想要的是下面的内容,实现此目的的正确方法是什么?
foo,1
bar,3
...