Kafka Stream初学
Kafka Stream将其API分为两类,一类为高级抽象的Kafka Streams DSL,使用方便,但不够灵活;另一类为低级抽象的Processor API,使得开发者有了更多自由,比较灵活。下面简要介绍两类API。
一.Streams DSL
Streams DSL是构建在Processor API之上的,相比于Processor API,DSL支持:
- 对streams和tables的抽象(KStreams和KTable)
- 声明函数式编程风格
下面简要介绍其中的主要类库及特性:
1.KStream
只有DSL中有KStream的概念。KStream是一个流式记录的抽象,是一个无界的数据集。用一个表来类比,数据记录在一个流中可以理解为一直在进行“INSERT”的动作。只进行追加。
2.KTable
只有DSL中有KTable的概念。KTable是一个changelog stream的抽象,每个数据记录都被表示为一个update。如果key在KTable中已经存在,则表示为一个“UPDATE”;如果不存在,则表示为一个“INSERT”。
3.GlobalKTable
只有DSL中有GlobalKTable的概念。和KTable一样,GlobalKTable也是一个changelog stream的抽象,每个数据记录都被表示为一个update。
KTable存储的数据根据key进行分区的,GlobalKTable是不分区的,且存储的数据足够小,能完全装入内存,因此保证每个流任务都有所有数据的完整副本,而不关心传入record的key是什么。
基于以上的特性,GlobalKTable有如下优点:
- 更高效的join操作:当链接多个join操作时,使用GlobalKTable效率更高,它不需要co-partitioned(类似shuffle的一种操作)的发生。
- 可用于将信息“广播”到应用程序的所有实例。
4.Transformation
无状态Transformation
(1)branch(split):根据提供的判断式将KStream拆分到一个或多个KStream实例中。
(2)Filter
(3)Inverse Filter
(4)FlatMap
(5)Foreach
(6)GroupByKey
(7)GroupBy
(8)Map
(9)Merge
(10)Peek
(11)Print
(12)SelectKey:为记录分配新key。
(13)toStream:将KTable转换为KStream。
有状态Transformation
(1)Aggregate
(2)Count
(3)Reduce
5.Join
下图为其支持的Join类型:

6.Window
Kafka Streams支持四种类型的Window操作:

Processor API
processor API允许开发人员自定义processor,且可以直接与state store进行交互。下面介绍其主要抽象:
1. Processor
一个stream processor是processor拓扑图中的一个节点,用来表示单一的处理步骤。使用Processor API可以自定义stream processor,一次处理一个接收到的记录,并将这些processor与其关联的state store连接起来,组成processor拓扑图。
Processor接口的主要方法如下:
- process():对于每条接收到的数据,都会调用此方法
- init():任务构建阶段被调用,进行资源的初始化动作
- close():任务结束阶段调用,进行资源清理动作
2.State Store
Kafka Stream中包含开箱即用的Store,通过StoreBuilder进行初始化;也可以实现自定义的Store,需要实现StateStore接口。
现有State Store类型如下:
(1)PersistentKeyValueStore<K,V>:底层存储为RocksDB
(2)InMemoryKeyValueStore<K,V>