赞
踩
本文会介绍:
1. Streams APIs
Kafka有两类流APIs,low-level Processor API和high-level Streams DSL。本文介绍的是后者DSL,它的核心是KStream对象,表示流式key/value的数据,它的大多数方法都返回KStream对象的引用。
早在2005年,Martin Fowler和Eric Evans开发了fluent interface的概念,也就是接口的返回值和调用时传入的实例是相同的。这种方式对构造多个参数的对象时非常有用,例如:
Person.builder().firstName("Beth").withLastName("Smith").withOccupation("CEO");
在Kafka Streams中,有个重要的区别:返回的KStream对象是一个新的实例,而不是调用方法时的实例。
2. Hello World例子
以下让我们创建一个简单的Hello World例子,把输入的字母转换为大写字母。一般的开发流程是:
2.1 配置Kafka Streams
- Properties props = new Properties();
- props.put(StreamsConfig.APPLICATION_ID_CONFIG, "hello-world");
- props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
以上两个属性是必须的,因为它们没有默认值。而且应用的ID在集群内必须是唯一的,服务器地址可以是单个服务器和端口,也可以是由逗号分隔的多个服务器和端口,例如"host1:9092,host2:9092,host3:9092"。
2.2 创建Serde实例
在Kafka Streams中,Serdes类提供了创建Serde实例的简便方法,如下所示:
Serde<String> stringSerde = Serdes.String();
此行代码是使用Serdes类创建序列化/反序列化所需的Serde实例。Serdes类为以下类型提供默认的实现:String、Byte array、Long、Integer和Double。
2.3 创建处理的拓扑
每个流应用程序都实现并执行至少一个拓扑。拓扑(在其它流处理框架中也称为有向无环图DAG,Directed Acyclic Graph)是一系列的操作和转换,每个事件从输入流动到输出。下图是Hello World例子的拓扑图:
下面是相应的处理拓扑代码:
- StreamsBuilder builder = new StreamsBuilder();
- KStream<String, String> simpleFirstStream = builder.stream("src-topic",
- Consumed.with(stringSerde, stringSerde));
- // 使用KStream.mapValues方法把每行输入转换为大写
- KStream<String, String> upperCasedStream = simpleFirstStream.mapValues(line -> line.toUpperCase());
- // 把转换结果输出到另一个topic
- upperCasedStream.to("out-topic", Produced.with(stringSerde, stringSerde));
2.4 创建和启动KStream
- KafkaStreams kafkaStreams = new KafkaStreams(builder.build(), props);
- kafkaStreams.start();
3. ZMart应用程序
3.1 主要的需求
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。