根据官方文档的说明首先需要先设置集群的端口:9092
在三台虚拟机的kafka配置文件里(server.properties) 修改如下:
如果没有在/etc/hosts文件里映射主机名跟ip地址的话,master就改为你的ip地址,我这里映射了所以是主机名:master
我的另外的两台机的配置分别为:
下面进行idea环境的配置
在idea上创建一个maven工程
然后在poml.xml文件里增加kafka-streams的依赖包:
<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-streams --> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-streams</artifactId> <version>2.2.2</version> </dependency>
开始写我们的wordcount代码,代码如下:
主要代码里面的192.168.65.25为我master的ip映射,这里需要改为你的master的ip地址
import org.apache.kafka.common.serialization.Serdes; import org.apache.kafka.streams.KafkaStreams; import org.apache.kafka.streams.StreamsBuilder; import org.apache.kafka.streams.StreamsConfig; import org.apache.kafka.streams.kstream.KStream; import org.apache.kafka.streams.kstream.KTable; import org.apache.kafka.streams.kstream.Produced; import java.util.Arrays; import java.util.Locale; import java.util.Properties; public class SteamSample { private static final String INPUT_TOPIC= "input"; //这个为生产者topic private static final String OUTPUT_TOPIC= "output";//这个为消费者topic public static void main(String[] args) { Properties props = new Properties(); props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG,"192.168.65.25:9092"); //master 主机映射 192.168.65.25 props.put(StreamsConfig.APPLICATION_ID_CONFIG,"wordcount9"); props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass()); props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass()); //如何构建流结构拓扑 final StreamsBuilder builder = new StreamsBuilder(); //构建Wordcount procesccc wordcountStream(builder); final KafkaStreams streams = new KafkaStreams(builder.build(),props); streams.start(); } //如何定义流计算过程 static void wordcountStream(final StreamsBuilder builder){ //不断从INPUT_TOPIC上获取新数据,并且追加到流上的一个抽象对象 KStream<String,String> source = builder.stream(INPUT_TOPIC); //Hello World imooc //KTable是数据集合的抽象对象 final KTable<String, Long> count = source.flatMapValues(value-> Arrays.asList(value.toLowerCase(Locale.getDefault()).split(""))) .groupBy((key, value)->value) .count(); count.toStream().to(OUTPUT_TOPIC, Produced.with(Serdes.String(),Serdes.Long())); System.out.println("2"); } }
我们先在kafka环境里创建我们的输入topic跟输出topic
在master端口分别输入:
kafka-topics.sh --create \
--bootstrap-server localhost:9092 \
--replication-factor 1 \
--partitions 1 \
--topic input
kafka-topics.sh --create \
--bootstrap-server localhost:9092 \
--replication-factor 1 \
--partitions 1 \
--topic output
当然要确保我们的kafka是完美启动了的!!!!!
创建好了topic后,先在idea让我们的wordcount代码跑起来,即先运行idea的wordcount代码
然后新开一个master,启动一个生产者即input:
kafka-console-producer.sh --broker-list localhost:9092 --topic input
然后在输入一些字母,如下:
然后在新开一个master,启动消费者即output:
kafka-console-consumer.sh --bootstrap-server localhost:9092 \
--topic output \
--property print.key=true \
--property print.value=true \
--property key.deserializer=org.apache.kafka.common.serialization.StringDeserializer \
--property value.deserializer=org.apache.kafka.common.serialization.LongDeserializer \
--from-beginning
然后可以看到stream的处理结果。
该stream的好玩之处在于你可以实时处理你在生产者输入的字母,然后消费者可以统计字母出现的次数。
做完,可以citl + C 关闭生产者跟消费者。
本次的kafka stream演示到此为止啦,有啥问题在下方评论,感谢感谢!!!