Kafka-Streams初识

一、Kafka-Streams是什么?

Kafka Streams是一个用于构建应用程序和微服务的客户端库,其中输入和输出数据存储在Kafka集群中,它结合了在客户端编写和部署标准Java和Scala应用程序的简单性与Kafka的服务器端集群技术的优势。

它是编写实时应用程序和微服务的最简单方法。

二、Kafka-Streams优点

1、弹性、高度可扩展、容错

2、可以部署到容器、虚拟机、裸机、云

3、同样适用于小型、中型和大型用例

4、与Kafka安全完全集成

5、编写标准的Java和Scala应用程序

6、一次处理语义

7、不需要单独的处理集群

8、支持在Mac、Linux、Windows上开发

三、WordCount代码示例

java 复制代码
public class WordCountApplication {

   public static void main(final String[] args) throws Exception {
       Properties props = new Properties();
       props.put(StreamsConfig.APPLICATION_ID_CONFIG, "wordcount-application");
       props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka-broker1:9092");
       props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
       props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass());

       StreamsBuilder builder = new StreamsBuilder();
       KStream<String, String> textLines = builder.stream("TextLinesTopic");
       KTable<String, Long> wordCounts = textLines
           .flatMapValues(textLine -> Arrays.asList(textLine.toLowerCase().split("\\W+")))
           .groupBy((key, word) -> word)
           .count(Materialized.<String, Long, KeyValueStore<Bytes, byte[]>>as("counts-store"));
       wordCounts.toStream().to("WordsWithCountsTopic", Produced.with(Serdes.String(), Serdes.Long()));

       KafkaStreams streams = new KafkaStreams(builder.build(), props);
       streams.start();
   }

}

它实现了WordCount算法,该算法从输入文本中计算单词,且可以对无限的、无界的数据流进行操作。与有界变体类似,它是一种跟踪和更新单词计数的有状态算法。但是,由于它必须假设潜在的无界输入数据,它将定期输出其当前状态和结果,同时继续处理更多数据,因为它无法知道何时处理了"所有"输入数据。

下面我们就实际来跑下这个程序

四、运行官方示例程序

1、创建名为streams-plaintext-input的输入topic

kafka-topics --create \

--bootstrap-server cdh1:9092 \

--replication-factor 1 \

--partitions 1 \

--topic streams-plaintext-input

2、创建名为streams-wordcount-output的输出topic

kafka-topics --create \

--bootstrap-server cdh1:9092 \

--replication-factor 1 \

--partitions 1 \

--topic streams-wordcount-output \

--config cleanup.policy=compact

3、启动WordCountDemo

kafka-run-class org.apache.kafka.streams.examples.wordcount.WordCountDemo

以上是官方的WordCountDemo启动,它源码中指定的bootstrap.servers是localhost:9092,如果是集群环境会报错

我们这里把WordCountDemo放到自己的maven项目中进行修改并运行。

WordCountDemo将从输入topic:streams-plaintext-input读取,对每个读取的消息执行WordCount算法的计算,并将其当前结果连续写入输出topic:streams-wordcount-output。因此,除了日志条目之外,不会有任何STDOUT输出,因为结果会在Kafka中写回。

4、测试观察

下面我们启动控制台生产者和消费者来测试下

kafka-console-producer --topic streams-plaintext-input --broker-list cdh1:9092,cdh2:9092,cdh3:9092
kafka-console-consumer --bootstrap-server cdh1:9092 \

--topic streams-wordcount-output \

--from-beginning \

--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

下面我们在producer端的控制台输入单词:

aaa bbb ccc ddd

我们再看看consumer端的情况:

我们继续输入

aaa ccc xxx

我们再看看consumer端的情况:

37那个可以忽略,因为crt每30秒回输入下回车

我们看到每次只会统计当次输入单词在历史数据中的count

相关推荐
五度易链-区域产业数字化管理平台12 分钟前
如何构建高质量产业数据信息库?五度易链的“八大核心库”与数据治理实践
大数据·人工智能
Elastic 中国社区官方博客21 分钟前
用 Elasticsearch 构建一个 ChatGPT connector 来查询 GitHub issues
大数据·人工智能·elasticsearch·搜索引擎·chatgpt·github·全文检索
哲霖软件30 分钟前
设备自动化行业ERP选型
大数据
武子康39 分钟前
大数据-172 Elasticsearch 索引操作与 IK 分词器落地实战:7.3/8.15 全流程速查
大数据·后端·elasticsearch
问道飞鱼1 小时前
【分布式知识】Redis-Shake 容器云部署完整指南
redis·分布式·redis-shake
学术小白人1 小时前
【落幕通知】2025年能源互联网与电气工程国际学术会议(EIEE 2025)在大连圆满闭幕
大数据·人工智能·机器人·能源·信号处理·rdlink研发家
物流可信数据空间1 小时前
专家解读 | 提升数据流通安全治理能力 促进数据流通开发利用【可信数据空间】
大数据·人工智能·安全
Acrelhuang1 小时前
直击新能源电能质量痛点:安科瑞 APView500 在线监测装置应用方案
大数据·运维·开发语言·人工智能·物联网
龙亘川2 小时前
2025 年中国养老机器人行业全景分析:技术演进、市场格局与商业化路径
大数据·人工智能·机器人
Elastic 中国社区官方博客2 小时前
Elasticsearch:在隔离环境中安装 ELSER 模型
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索