Kafka Streams 开发单词计数应用

1、添加依赖(IDEA工具操作)

<dependency>

            <groupId>org.apache.kafka</groupId>

            <artifactId>kafka-streams</artifactId>

            <version>2.0.0</version>

        </dependency>

2、编写代码(IDEA工具操作)

根据上述业务流程分析得出,单词数据通过自定义处处理器接收并执行相应业务计算,因此创建LogProcessor类,并且继承StreamsAPI中的P ocessor接口,在Processor接口中,定义了以下3个方法。

(1)init(ProcessorContextprocessorContext):初如治化上下文对象。

(2)process(Key,Value):每接收到一条消息时,都会调用该方法处理并更新状态进行存储。

(3)close():关闭处理器,这里可以做一些资源清理理工作。 Kafka Streams单词计数详细代码如下所示。

import org.apache.kafka.streams.processor.Processor;

import org.apache.kafka.streams.processor.ProcessorContext;

import java.util.HashMap;

public class LogProcessor implements Processor<byte[],byte[]> {

    private ProcessorContext processorContext;

    public void init(ProcessorContext processorContext) {

        this.processorContext = processorContext;

    }

    public void process(byte[] key, byte[] value) {

        String inputOri = new String(value);

        HashMap <String,Integer>map = new HashMap<String, Integer>();

        int times = 1;

        if (inputOri.contains("")){

            //截取字段

            String[] words = inputOri.split(" ");

            for (String word : words){

                if (map.containsKey(word)){

                    map.put(word,map.get(word)+1);

                }else {

                    map.put(word,times);

                }

            }

        }

        inputOri = map.toString();

        processorContext.forward(key,inputOri.getBytes());

    }

    public void close() {

    }

}

单词计数的业务功能开发完之后,Kafka Streams 需要编写一个运行主程序的类App,来测试LogProcessor业务程序,具体代码如下:

import org.apache.kafka.streams.KafkaStreams;

import org.apache.kafka.streams.StreamsConfig;

import org.apache.kafka.streams.Topology;

import org.apache.kafka.streams.processor.Processor;

import org.apache.kafka.streams.processor.ProcessorSupplier;

import java.util.Properties;

public class App {

    public static void main(String[] args) {

        //声明来源主题

        String fromTopic = "test1";

        //声明目标主题

        String toTopic = "test2";

        //设置参数信息

        Properties props = new Properties();

        props.put(StreamsConfig.APPLICATION_ID_CONFIG,"logProcessor");

        props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG,

                "master:9092,slave1:9092,slave2:9092");

        //实例化StreamsConfig对象

        StreamsConfig config = new StreamsConfig(props);

        //构建拓扑结构

        Topology topology = new Topology();

        //添加原处理节点,为原处理节点指定名称和他订阅的主题

        topology.addSource("SOURCE",fromTopic)

                //添加自定义处理节点,指定处理器类和上一节点的名称

        .addProcessor("PROCESSOR", new ProcessorSupplier() {

            public Processor get() {

                return new LogProcessor();

            }

        },"SOURCE")

                //添加目标处理节点,需要指定目标处理节点和上一节点的名称

                .addSink("SINK",toTopic,"PROCESSOR");

        //实例化KafkaStreams对象

        KafkaStreams streams = new KafkaStreams(topology,config);

        streams.start();

    }

}

3、执行测试

 代码编写完后,在master节点创建test1和test2主题,命令如下:

创建来源主题

kafka-topics.sh --create \

--topic test1 \

--partitions 3 \

--replication-factor 2 \

--zookeeper master:2181,slave1:2181,slave2:2181

 

创建目标主题

kafka-topics.sh --create \

--topic test2 \

--partitions 3 \

--replication-factor 2 \

--zookeeper master:2181,slave1:2181,slave2:2181

 

成功创建好目标主题后,分别在master节点和slave1节点启动生产者服务和消费者服务。

启动生产者服务命令如下:

kafka-console-procuder.sh \

--broker-list master:9092,slave1:9092,slave2:9092 \

--topic test1

 

启动消费者服务命令如下:

kafka-console-consumer.sh \

--from-beginning \

--topic test2 \

--bootstrap-server master:9092,slave1:9092,slave2:9092

 

 

在生产者服务节点master输入数据:

 

到IDEA中运行创建好的App文件中的代码,运行结果如下: 

 

 

以上两张图可以看到Kafka Streams所需的测试环境已经配置完成了。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是一个简单的Kafka Streams应用程序,它从一个名为“input_topic”的Kafka主题中读取字符串消息,并将它们转换为大写字符串,然后将它们写入另一个名为“output_topic”的Kafka主题中。 ```java import java.util.Properties; import org.apache.kafka.common.serialization.Serdes; import org.apache.kafka.streams.KafkaStreams; import org.apache.kafka.streams.StreamsBuilder; import org.apache.kafka.streams.kstream.Consumed; import org.apache.kafka.streams.kstream.KStream; import org.apache.kafka.streams.kstream.Produced; public class MyKafkaStreamsApp { public static void main(String[] args) { // Define Kafka Streams properties Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("application.id", "my-kafka-streams-app"); // Create a StreamsBuilder object StreamsBuilder builder = new StreamsBuilder(); // Create a KStream object by reading from the input topic KStream<String, String> inputStream = builder.stream( "input_topic", Consumed.with(Serdes.String(), Serdes.String()) ); // Transform each message to uppercase KStream<String, String> outputStream = inputStream.mapValues( value -> value.toUpperCase() ); // Write the transformed messages to the output topic outputStream.to( "output_topic", Produced.with(Serdes.String(), Serdes.String()) ); // Create a KafkaStreams object and start the application KafkaStreams streams = new KafkaStreams(builder.build(), props); streams.start(); } } ``` 在这个例子中,我们首先定义了一些Kafka Streams属性,然后创建了一个StreamsBuilder对象。接着,我们使用builder对象从“input_topic”读取消息,并使用mapValues()方法将消息转换为大写字符串。最后,我们使用to()方法将转换后的消息写入“output_topic”。 最后,我们创建了一个KafkaStreams对象,并启动了应用程序。当启动应用程序时,Kafka Streams将自动创建并管理所需的Kafka主题分区。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一杯彬美式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值