将Kafka Consumer和Producer整合到一个功能中

时间:2018-01-29 14:45:56

标签: scala apache-kafka apache-flink kafka-consumer-api kafka-producer-api

我们需要开发一个代码,其中Consumer运行监听特定的kafka生产者,然后在同一个函数中生成从当前消费者到不同生产者主题的处理数据。

这是为了集成,使代码与Java交换代码,其中Java为一个主题生成消息,flink使用它并为不同的主题生成新数据,以便Java进一步处理它。

如果有其他方法可以执行此过程,请告知我们。

3 个答案:

答案 0 :(得分:4)

Flink integrates nicely with Kafka,如果需要,可以利用Kafka交易。这样的应用程序看起来像这样:

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
FlinkKafkaConsumer011<> consumer = new FlinkKafkaConsumer011<IN>(topic_in, serializer_in, kafkaProperties);
FlinkKafkaProducer011<> producer = new FlinkKafkaProducer011<OUT>(broker, topic_out, serializer_out)

env.addSource(consumer)
   .map(new SuitableTransformation())
   .addSink(producer)
   .execute()

答案 1 :(得分:1)

这听起来像是&#34; read-process-write&#34;图案。你可以利用Kafka的transaction functionality来使这个过程成为原子(或者不是,它取决于你,但下面的例子使用了交易):

KafkaProducer producer = createKafkaProducer(
  "bootstrap.servers", "localhost:9092",
  "transactional.id", "my-transactional-id");

producer.initTransactions();

KafkaConsumer consumer = createKafkaConsumer(
  "bootstrap.servers", "localhost:9092",
  "group.id", "my-group-id",
  "isolation.level", "read_committed");

consumer.subscribe(singleton("inputTopic"));

while (true) {
  ConsumerRecords records = consumer.poll(Long.MAX_VALUE);
  producer.beginTransaction();
  for (ConsumerRecord record : records)
    producer.send(producerRecord("outputTopic", record));
  producer.sendOffsetsToTransaction(currentOffsets(consumer), group);  
  producer.commitTransaction();
}
  

这是为了集成,使代码与Java交换代码,其中Java为一个主题生成消息,flink使用它并为不同的主题生成新数据,以便Java进一步处理它。

您可能需要考虑Kafka Streams:https://docs.confluent.io/current/streams/developer-guide/index.html

答案 2 :(得分:0)

这听起来像是使用akka streams的好地方, val done = Consumer.committableSource(consumerSettings, Subscriptions.topics("topic1")) .map(msg => ProducerMessage.Message(new ProducerRecord[Array[Byte], String]("topic2", msg.record.value), msg.committableOffset)) .via(Producer.flow(producerSettings)) .map(_.message.passThrough) .batch(max = 20, first => CommittableOffsetBatch.empty.updated(first)) { (batch, elem) => batch.updated(elem) } .mapAsync(3)(_.commitScaladsl()) .runWith(Sink.ignore)