将输出链接到Kafka,这是使用KeyedSerializationSchema的正确方法

时间:2019-02-22 04:32:43

标签: apache-kafka apache-flink

我有一个简单的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
...

我的问题是

  1. 我已经在互联网上使用上面提到的WordCountSerializer看到了几个示例,但这对我不起作用,我在这里做错了吗?
  2. 在如上所述更改了serializeValue方法之后,它部分起作用,但是我真正想要的是下面的内容,实现此目的的正确方法是什么?

    foo,1

    bar,3

    ...

0 个答案:

没有答案