Kafka Streams:如何写主题?

时间:2016-06-29 17:54:50

标签: apache-kafka apache-kafka-streams

在Kafka Streams中,生成/编写流的规范方式是什么?在Spark中,有一个自定义接收器,它作为来自任意数据源的长时间运行的适配器。 Kafka Streams中的等价物是什么?

具体而言,我不会问如何从一个主题转换到另一个主题。文档非常明确。我想了解如何编写我的工作人员,这些工作人员将在Kafka的一系列转换中首次编写。

我希望能够做到

builder1.<something>(<some intake worker like a spark reciver)
       .to(topic1)
       .start()

builder2.from(topic1)
        .transform(<some transformation function>)
        .to(topic2)
        .start()

但是现有的文档都没有显示出来吗?我错过了什么吗?

3 个答案:

答案 0 :(得分:6)

取决于您使用的是Kafka Streams DSL还是处理器API:

  • Kafka Streams DSL 您可以使用KStream#to()KStream具体化为主题。这是将数据实现到主题的规范方法。或者,您可以使用KStream#through()。这也将实现主题的数据,但也返回结果KStream以供进一步使用。 #to()#through()之间的唯一区别在于,如果您希望将生成的具体化分区设为KStreamBuilder#stream(),则会为您节省KStream

  • 处理器API 您通过将数据转发到接收器处理器来实现数据到分区。

无论哪种方式,需要注意的一件重要事情是,在使用上述方法之一写入分区之前,数据不会实现主题。 map()filter()等不会实现数据。数据保留在处理器任务/线程/内存中,直到通过上述方法之一实现。

制作Kafka Streams:

Properties producerConfig = new Properties();
producerConfig.put(BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:2181");
producerConfig.put(ACKS_CONFIG, "all");
producerConfig.put(RETRIES_CONFIG, 0);
Producer<Integer, Integer> producer = new KafkaProducer<>(producerConfig, new IntegerSerializer(), new IntegerSerializer<>());

然后:

Arrays.asList(1, 2, 3, 4).forEach(integer -> producer.send(new ProducerRecord<>("integers", integer, integer)))

您将需要:

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>${version.kafka}</version>
</dependency>

答案 1 :(得分:4)

  

我想了解如何编写我的工作人员,这些工作人员将在一系列转换中首次写入kafka。

初始写入(=输入数据)不应通过Kafka Streams完成。 Kafka Streams假设输入数据已经在Kafka中。

因此,您的预期工作流程不适用:

builder1.<something>(<some intake worker like a spark reciver)
   .to(topic1)
   .start()

相反,你会使用类似Kafka Connect的东西来获取数据到Kafka(例如从数据库到Kafka主题)或使用“普通”Kafka生产者客户端(Java,C / C ++,Python,...)将输入数据写入Kafka。

Kafka Streams中没有“钩子”来引导输入数据。我们正在考虑更好地整合Kafka Connect和Kafka Streams,因此在不久的将来这种情况可能会有所改善。

答案 2 :(得分:-1)

您可以尝试以下Linux命令:

bin/kafka-console-producer.sh --broker-list localhost:9092 --topic topicName --property "parse.key=true"property "key.separator=:";
    设置为true时,
  1. parse.key允许从控制台接受输入作为键和值对。

  2. key.separator将设置为键和值对的分隔符。