在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()
但是现有的文档都没有显示出来吗?我错过了什么吗?
答案 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=:";
parse.key允许从控制台接受输入作为键和值对。
key.separator将设置为键和值对的分隔符。