初探 Kafka Streams 之二:编写 Kafka Streams 应用程序

一、构建一个 Maven 项目

通过如下命令,利用Kafka Streams Maven Archetype创建一个Streams项目:

mvn archetype:generate \
    -DarchetypeGroupId=org.apache.kafka \
    -DarchetypeArtifactId=streams-quickstart-java \
    -DarchetypeVersion=2.5.0 \
    -DgroupId=streams.examples \
    -DartifactId=streams.examples \
    -Dversion=0.1 \
    -Dpackage=myapps

00-创建Streams项目结构

01-创建Streams项目结构

针对groupId, artifactIdpackage参数可以设置不同的值,所创建的项目结构如下:

02-创建Streams项目结构

pom.xml文件定义了Streams依赖项。注意:生成的pom.xml文件以Java8为目标,不适用于更高版本的 Java。src/main/java目录下已经有几个用Streams库编写的示例程序,可以删除,然后从头开始编写此类程序:

cd streams.examples/
rm src/main/java/myapps/*.java

二、编写第一个 Streams 应用程序:Pipe

src/main/java/myapps目录下创建一个 java 文件,命名为Pipe.java

package myapps;

import org.apache.kafka.common.serialization.Serdes;
import org.apache.kafka.streams.StreamsBuilder;
import org.apache.kafka.streams.StreamsConfig;
import org.apache.kafka.streams.Topology;
import org.apache.kafka.streams.kstream.KStream;

import java.util.Properties;

public class Pipe {
   
    public static void main(String[] args) throws Exception {
   
        // 创建java.util.Properties属性映射以指定StreamsConfig中定义的不同流执行配置值
        Properties props = new Properties();
        // 为Streams应用程序提供唯一的标识符,以便于与同一Kafka集群对话的其他应用程序区分开来
        props.put(StreamsConfig.APPLICATION_ID_CONFIG, "streams-pipe");
        // 指定用于建立到Kafka集群的初始连接的主机/端口对列表
        props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.3.169:9092");
        // 在同一映射中自定义其他配置:如记录键值对的默认序列化和反序列化库
        props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
        props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass());

        // 定义Streams应用程序的计算逻辑,
        // 在Kafka流中,该计算逻辑被定义为连接的处理器节点的拓扑,可以使用拓扑生成器来构造这样的拓扑
        final StreamsBuilder builder = new StreamsBuilder();
        // 使用该拓扑生成器从一个命名为streams-plaintext-input的Kafka主题创建一个源流
        KStream<String, String> source = builder.stream("streams-plaintext-input");
        // 将从源Kafka主题流中生成的记录(字符串键值对)写入另一个Kafka主题
        source.to("streams-pipe-output");

        // 检查从该生成器创建的拓扑类型
        final Topology topology = builder.build();
        System.out.println(topology.describe());
    }
}

Kafka Streams客户端库配置见:3.6 Kafka Streams Configs

编译和运行以上程序:

mvn clean package
mvn exec:java -Dexec.mainClass=myapps.Pipe

03-Pipe Topology

以上打印信息说明构造的拓扑有两个处理器节点,一个是源节点KSTREAM-SOURCE-0000000000,一个是汇聚节点KSTREAM-SINK-0000000001KSTREAM-SOURCE-0000000000从Kafka主题流streams-plaintext-input中连续读取记录,并将记录发送到它的下游节点KSTREAM-SINK-0000000001KSTREAM-SINK-0000000001将写入它的每个接收到的记录,以便发送到另一个Kafka主题streams-pipe-output(箭头--><--指示此节点的下游和上游处理器节点)。该信息还说明了这个简单的拓扑没有与之相关联的全局状态存储。

完整代码如下:

package myapps;

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.Topology;

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值