Java 如何实现FlinkKafkaPartitioner?
我正在开发一个Flink服务,在这里我从一个卡夫卡读取消息,然后将它们反序列化到HashMap,用它们做一些事情,最后将它们写入另一个卡夫卡。现在我遇到了一个我不知道如何解决的问题,而且我在网上找不到关于如何解决这个问题的例子。 我想做的是为我的Flink Kafka制作人创建一个自定义分区,这样具有相同id的事件就可以进入相同的分区,因为保持相同id的事件的顺序很重要。然而,我不明白如何实现FlinkKafkaPartitioner,文档在这方面没有什么帮助 到目前为止,我对Producer的了解如下(对FlinkkafKapProducer使用null,因为我只是想让它工作,但这应该被自定义分区器所取代): 其中eventsFromOldPipe发出HashMap 现在假设eventsFromOldPipe中的HashMap包含一个sessionId字段,我想将其用作分区键,理想情况下,如果可能的话,我还想从制作人发送给Kafka的记录中删除该sessionId(删除该字段并不重要,但最好)Java 如何实现FlinkKafkaPartitioner?,java,apache-kafka,apache-flink,Java,Apache Kafka,Apache Flink,我正在开发一个Flink服务,在这里我从一个卡夫卡读取消息,然后将它们反序列化到HashMap,用它们做一些事情,最后将它们写入另一个卡夫卡。现在我遇到了一个我不知道如何解决的问题,而且我在网上找不到关于如何解决这个问题的例子。 我想做的是为我的Flink Kafka制作人创建一个自定义分区,这样具有相同id的事件就可以进入相同的分区,因为保持相同id的事件的顺序很重要。然而,我不明白如何实现FlinkKafkaPartitioner,文档在这方面没有什么帮助 到目前为止,我对Producer的
我对Flink实现中更“自定义”的部分非常陌生,因此我在这方面非常迷茫,因此非常感谢您的帮助。只需实现KafkaSerializationSchema,用key和value定义ProducerRecord即可。
卡夫卡将按您定义的键对记录进行分区。您是否检查了卡夫卡镜像生成器?官方工具旨在将数据从一个卡夫卡移动到另一个卡夫卡。您可以先使用flink转换源卡夫卡中的数据,然后将转换后的数据从源卡夫卡镜像到目标卡夫卡,这比不需要定制flink卡夫卡制作者所需的工作量要小得多
FlinkKafkaProducer010<String> writeToNewPipe = new FlinkKafkaProducer010<String>(
processorConfig.getKafkaDestTopic(),
new SimpleStringSchema(),
producerProps,
(FlinkKafkaPartitioner) null
);
eventsFromOldPipe
.map(event -> {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
try {
return mapper.writeValueAsString(event);
}
catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
})
.addSink(writeToNewPipe);