Kafka之Kafka Streams使用练习

本文介绍如何使用KafkaStreams从first主题读取消息,通过自定义处理器LogProcessor进行数据处理,去除特定标记,再将处理后的数据写入second主题。演示了KafkaStreams的配置、拓扑结构创建及启动流程。

前言

  • kafka版本:2.11-2.1.1
  • 主要练习的功能是:在某个生产者向first主题中生产消息时,同时通过KafkaStreams将生产消息作特定处理后输出到主题second中

Maven依赖

<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients -->
<!-- Kafka客户端API -->
<dependency>
	<groupId>org.apache.kafka</groupId>
	<artifactId>kafka-clients</artifactId>
	<version>2.1.1</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka -->
<!-- Kafka核心API -->
<dependency>
	<groupId>org.apache.kafka</groupId>
	<artifactId>kafka_2.11</artifactId>
	<version>2.1.1</version>
</dependency>

<!--声明KafkaStreams依赖包-->
<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-streams -->
<dependency>
	<groupId>org.apache.kafka</groupId>
	<artifactId>kafka-streams</artifactId>
	<version>2.1.1</version>
</dependency>

代码

KafkaSteamsDemo.java:

/**
 * <p>本类主要用于演示{@link KafkaStreams}的使用方法,同时也是练习.
 * KafkaStreams所需配置信息可查看{@link StreamsConfig}.
 * (已测试)
 *
 * @author TomAndersen
 * @version 1.0
 * @date 2020/3/19
 */
public class KafkaSteamsDemo {
    public static void main(String[] args) {

        // 1.配置相关参数
        Properties props = new Properties();
        // 设置Application ID
        props.put(StreamsConfig.APPLICATION_ID_CONFIG, "KafkaStreamsDemo");
        // 设置Brokers集群
        props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "hadoop101:9092,hadoop102:9092,hadoop103:9092");
        // 设置Key和Value的序列化/反序列化器
        /*props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
        props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass());*/
        // 定义Stream的数据源和数据池Topic
        String streamSourceTopic = "first";
        String streamSinkTopic = "second";

        // 2.创建StreamsBuilder实例
        StreamsBuilder streamsBuilder = new StreamsBuilder();

        // 3.创建并配置Streams拓扑结构
        Topology topology = streamsBuilder.build()
                .addSource("StreamSource", streamSourceTopic)
                .addProcessor("StreamProcessor", new ProcessorSupplier<byte[], byte[]>() {
                    @Override
                    public Processor<byte[], byte[]> get() {
                        return new LogProcessor();
                    }
                }, "StreamSource")
                .addSink("StreamSink", streamSinkTopic, "StreamProcessor");

        // 4.创建KafkaStreams实例
        KafkaStreams kafkaStreams = new KafkaStreams(topology, props);

        // 5.启动KafkaStreams
        kafkaStreams.start();
    }
}

LogProcessor.java:

/**
 * 此类主要用于为KafkaStreams实现中间的处理过程.
 * (已测试)
 * @author TomAndersen
 * @version 1.0
 * @date 2020/3/20
 */
public class LogProcessor implements Processor<byte[], byte[]> {
    // 定义配置信息
    private ProcessorContext context;

    // 初始化获取配置信息
    @Override
    public void init(ProcessorContext context) {
        this.context = context;
    }

    // 正式的处理逻辑
    // 本次实现的主要处理功能是将value中的">>>"标记清除
    @Override
    public void process(byte[] key, byte[] value) {

        // 将输入的字节数组转化成String对象
        String inputValue = new String(value);
        // 清除字符串中的指定字符
        inputValue = inputValue.replaceAll(">>>", "");
        // 将处理后的<Key Value>输出到上下文对象Context中,之后会传输给下一个Topic
        context.forward(key, inputValue.getBytes());

    }

    // 释放相关资源
    @Override
    public void close() {

    }
}

End~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值