一、构建一个 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
针对groupId
, artifactId
和package
参数可以设置不同的值,所创建的项目结构如下:
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
以上打印信息说明构造的拓扑有两个处理器节点,一个是源节点KSTREAM-SOURCE-0000000000
,一个是汇聚节点KSTREAM-SINK-0000000001
。KSTREAM-SOURCE-0000000000
从Kafka主题流streams-plaintext-input
中连续读取记录,并将记录发送到它的下游节点KSTREAM-SINK-0000000001
;KSTREAM-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;