Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何实现FlinkKafkaPartitioner?_Java_Apache Kafka_Apache Flink - Fatal编程技术网

Java 如何实现FlinkKafkaPartitioner?

Java 如何实现FlinkKafkaPartitioner?,java,apache-kafka,apache-flink,Java,Apache Kafka,Apache Flink,我正在开发一个Flink服务,在这里我从一个卡夫卡读取消息,然后将它们反序列化到HashMap,用它们做一些事情,最后将它们写入另一个卡夫卡。现在我遇到了一个我不知道如何解决的问题,而且我在网上找不到关于如何解决这个问题的例子。 我想做的是为我的Flink Kafka制作人创建一个自定义分区,这样具有相同id的事件就可以进入相同的分区,因为保持相同id的事件的顺序很重要。然而,我不明白如何实现FlinkKafkaPartitioner,文档在这方面没有什么帮助 到目前为止,我对Producer的

我正在开发一个Flink服务,在这里我从一个卡夫卡读取消息,然后将它们反序列化到HashMap,用它们做一些事情,最后将它们写入另一个卡夫卡。现在我遇到了一个我不知道如何解决的问题,而且我在网上找不到关于如何解决这个问题的例子。 我想做的是为我的Flink Kafka制作人创建一个自定义分区,这样具有相同id的事件就可以进入相同的分区,因为保持相同id的事件的顺序很重要。然而,我不明白如何实现FlinkKafkaPartitioner,文档在这方面没有什么帮助

到目前为止,我对Producer的了解如下(对FlinkkafKapProducer使用null,因为我只是想让它工作,但这应该被自定义分区器所取代):

其中eventsFromOldPipe发出HashMap

现在假设eventsFromOldPipe中的HashMap包含一个sessionId字段,我想将其用作分区键,理想情况下,如果可能的话,我还想从制作人发送给Kafka的记录中删除该sessionId(删除该字段并不重要,但最好)


我对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);