Kafka在0.10版本推出了Stream API,提供了对存储在Kafka内的数据进行流式处理和分析的能力。
本文将从流式计算出发,之后介绍Kafka Streams的特点,最后探究Kafka Streams的架构。
什么是流式计算流式计算一般被用来和批量计算做比较。批量计算往往有一个固定的数据集作为输入并计算结果。而流式计算的输入往往是“无界”的(Unbounded Data),持续输入的,即永远拿不到全量数据去做计算;同时,计算结果也是持续输出的,只能拿到某一个时刻的结果,而不是最终的结果。(批量计算是全量的:拿到一批数据,计算一个结果;流式计算是增量的:数据持续输入,持续计算最新的结果)
举个例子,统计电商网站一天中不同地区的订单量:
批量计算的方式:在一天过去之后(产生了固定的输入),扫描所有的订单,按照地区group并计数
流式计算的方式:每产生一个订单,根据订单的地区进行计数
流式计算相对于批量计算会有更好的实时性,倾向于先确定计算目标,在数据到来之后将计算逻辑应用到数据上。
流式计算和实时计算
流式计算的实时性较高,有时候容易和实时计算混淆。
流式计算对比的对象应该是批量计算,而实时计算对应离线计算。
流式计算强调的是计算的方式,而事实计算则强调计算结果的响应时间。
比如统计订单量,流式计算的方式是有一个计数,没来一笔订单就对这个计数加1。实时计算则是在在某个时刻计算一次当前时刻之前已经产生的所有订单量,比如在MySQL中执行一次Count操作。
Kafka Streams是什么Kafka Streams is a client library for building applications and microservices, where the input and output data are stored in Kafka clusters. It combines the simplicity of writing and deploying standard Java and Scala applications on the client side with the benefits of Kafka's server-side cluster technology.
Kafka Streams是一个客户端类库,用于处理和分析存储在Kafka中的数据。它建立在流式处理的一些重要的概念之上:如何区分事件时间和处理时间、Windowing的支持、简单高效的管理和实时查询应用程序状态。
Kafka Streams的门槛非常低:和编写一个普通的Kafka消息处理程序没有太大的差异(得益于Kafka Streams是一个客户端类库且运行只依赖与Kafka环境),可以通过多进程部署来完成扩容、负载均衡、高可用(Kafka Consumer的并行模型)。
Kafka Streams的一些特点:
被设计成一个简单的、轻量级的客户端类库,能够被集成到任何Java应用中
除了Kafka之外没有任何额外的依赖,利用Kafka的分区模型支持水平扩容和保证顺序性
通过可容错的状态存储实现高效的状态操作(windowed joins and aggregations)
支持exactly-once语义
支持纪录级的处理,实现毫秒级的延迟
提供High-Level的Stream DSL和Low-Level的Processor API
Kafka Streams模型 Stream Processing Topologystream是Kafka Streams中最重要的抽象:代表一个无界的、持续更新的数据集。stream是有序的、可重放的、容错的不可变数据记录的序列,其中的数据记录为键值对类型。
stream processing application是使用了Kafka Streams库的应用程序。它通过processor topologies定义计算逻辑,其中每个processor topology都是多个stream processor(节点)通过stream组成的图。
stream processor是processor topology中的节点,代表一个处理步骤:通过接收上游的processor的输入,应用计算逻辑,产生一个或多个输入到下游的processor。
有两种特殊的processor:
source processor: 没有上游processor,接收来自一个或多个Kafka Topic的数据,处理并传递到下游的processor
sink processor: 没有下游processor,接收来自上游processer的数据,处理并写入到Kafka Topic中
Kafka Streams提供了两种定义stream process topology的方式:Kafka Streams DSL和Processor API。Kafka Streams DSL提供了基础的、通用的数据操作,比如map、filter、join、aggregations。Processor API定义和链接用户自定义的processor,并且和state store交互。
Time流处理中一个关键的方面是时间的概念,以及它如何建模和整合。例如windowing操作是基于时间边界定义的。
stream中的一些时间:
Event time:事件发生的时间,产生在“客户端”。location change.