Kafka Streams | 流,实时处理和功能

1.目标

在咱们以前的Kafka教程中,咱们讨论了Kafka中的ZooKeeper今天,在这个Kafka Streams教程中,咱们将学习Kafka中Streams的实际含义。此外,咱们将看到Kafka Stream架构,用例和Kafka流功能。此外,咱们将讨论Apache Kafka中的流处理拓扑。java

Kafka Streams是一个用于构建应用程序和微服务的客户端库,尤为是输入和输出数据存储在Apache Kafka Clusters中基本上,凭借Kafka服务器端集群技术的优点,Kafka Streams结合了编写的简单性以及在客户端部署标准JavaScala应用程序。 linux

那么,让咱们从Apache Kafka Streams开始吧。apache

Kafka Stream教程

Kafka Streams | 流和实时处理安全

首先,咱们来讨论一下Stream和Real-Time Kafka Processing服务器

2.卡夫卡的流和实时处理 

咱们称之为Kafka Stream处理,能够连续,同时,逐条记录地实时处理数据。架构

Kafka中的实时处理是Kafka的应用之一。 app

基本上,Kafka实时处理包括连续的数据流。所以,在分析了这些数据以后,咱们从中得到了一些有用的数据。如今,在谈到Kafka时,实时处理一般涉及从主题(源)读取数据,进行一些分析或转换工做,而后将结果写回另外一个主题(接收器)。要作这种类型的工做,有几种选择。 框架

咱们可使用Kafka Consumer编写本身的自定义代码来读取数据并经过Kafka Producer写入数据。 分布式

或者咱们使用完整的流处理框架,如Spark StreamingFlinkStorm等。
可是,有一个替代上述选项,即Kafka Streams。那么,让咱们了解Kafka Streams。ide

3. Kafka Streams是什么?

Kafka Streams是一个客户端库,咱们使用它来处理和分析存储在Kafka中的数据。它依赖于重要的流处理概念,例如正确区分事件时间和处理时间,窗口支持,简单而有效的管理以及应用程序状态的实时查询。 

此外,Kafka Streams的入门门槛低,这意味着咱们能够在一台机器上快速编写和运行小规模的概念验证。为此,咱们只须要在多台机器上运行咱们的应用程序的其余实例,以扩展到大批量生产工做负载。此外,经过利用Kafka的并行模型,它能够透明地处理同一应用程序的多个实例的负载平衡。

与Kafka Streams相关的一些要点:

  • Kafka Stream能够轻松嵌入到任何Java应用程序中,并与用户为其流应用程序提供的任何现有打包,部署和操做工具集成,由于它是一个简单轻量级的客户端库。
  • Apache Kafka自己之外的系统没有外部依赖关系做为内部消息传递层。
  • 为了实现很是快速和有效的有状态操做(窗口链接和聚合),它支持容错本地状态。
  • 为了保证每一个记录只处理一次,即便在处理过程当中Streams客户端或Kafka代理发生故障时也只处理一次,它只提供一次处理语义。
  • 为了实现毫秒级处理延迟,采用一次记录一次处理。此外,随着记录的延迟到来,它支持基于事件时间的窗口操做。
  • 除了高级Streams DSL和低级处理器API以外,它还提供必要的流处理原语。

4.卡夫卡的流处理拓扑

  • Kafka Streams最重要的抽象是一个基本上,它表明了一个无限的,不断更新的数据集。换句话说,在订单,可重放和容错的不可变数据记录序列中,数据记录被定义为键值对,咱们称之为流。
  • 此外,任何使用Kafka Streams库的程序都是流处理应用程序经过一个或多个处理器拓扑,它定义其计算逻辑,尤为是在处理器拓扑是经过流(边缘)链接的流处理器(节点)的图形的状况下。
  • 在Stream处理器拓扑中,有一个节点咱们称之为流处理器它表示经过从拓扑中的上游处理器一次接收一个输入记录,将其操做应用于其中来转换流中的数据的处理步骤。此外,能够随后向其下游处理器产生一个或多个输出记录。

在卡夫卡得分 - 测试你的知识

Kafka Streams拓扑中的两个特殊处理器是:

一个。源处理器

它是一种特殊类型的流处理器,没有任何上游处理器。经过使用来自一个或多个Kafka主题的记录并将其转发到其下游处理器,它会为其拓扑生成输入流。

湾 接收器处理器

与源处理器不一样,此流处理器没有下游处理器。基本上,它将从其上游处理器接收的任何记录发送到指定的Kafka主题
阅读Apache Kafka Security | Kafka的需求和组件
注意:在处理当前记录时,也能够在普通处理器节点中访问其余远程系统。所以,处理后的结果能够流回Kafka或写入外部系统。

卡夫卡流

Kafka流处理器拓扑

5. Kafka Streams Architecture

基本上,经过构建Kafka生产者和消费者库并利用Kafka的本机功能来提供数据并行性,分布式协调,容错和操做简单性,Kafka Streams简化了应用程序开发。
让咱们修改Kafka架构
下图描述了使用Kafka Streams库的应用程序的解剖结构。 

卡夫卡流

Kafka Streams Architecture

一个。流分区和任务

可是,对于存储和传输,Kafka的消息传递层对数据进行分区。一样,对于处理数据,Kafka Streams对其进行分区。所以,咱们能够说分区是实现数据局部性,弹性,可伸缩性,高性能和容错的缘由。在并行化的背景下,Kafka Streams和Kafka之间有着密切的联系:

  • 每一个Kafka流分区按顺序是一系列数据记录,并映射到Kafka主题分区。
  • 流中的数据记录映射到该主题的Kafka消息。
  • 在Kafka和Kafka Streams中,数据记录的密钥决定了数据的分区,即数据记录的密钥决定了到主题内特定分区的路由。

看看Kafka的优势和缺点
此外,经过将应用程序的处理器拓扑分解为多个任务,它能够进行缩放。可是,在应用程序的输入流分区的基础上,Kafka Streams建立了固定数量的任务,每一个任务都分配了Kafka输入流中的分区列表(即Kafka主题)。 此外,无需人工干预,Kafka流任务既能够独立处理,也能够并行处理。
下图描述了两个任务,每一个任务分配了输入流的一个分区。

卡夫卡流

Kafka流体系结构 - 流分区和任务

湾 线程模型

Kafka Streams容许用户配置库可用于在应用程序实例中并行化进程的线程数。可是,凭借其独立的处理器拓扑,每一个线程能够执行一个或多个任务。例如,下面的图像描述了一个运行两个流任务的流线程。

测试你在卡夫卡的位置

卡夫卡流

Kafka流体系结构 - 线程模型

C。当地的国家商店

Kafka Streams提供所谓的国营商店基本上,咱们使用它来经过流处理应用程序存储和查询数据,这是实现有状态操做时的一项重要功能。例如,当您调用有状态运算符(例如join()或aggregate())或者窗口化流时,Kafka Streams DSL会自动建立和管理此类状态存储。
在Kafka Streams应用程序中,每一个流任务能够嵌入一个或多个本地状态存储,甚至API也能够访问存储并查询处理所需的数据。此外,Kafka Streams等本地国营商店提供容错和自动恢复功能。
想知道Apache Kafka职业范围 - 请点击连接
下图描述了两个流任务及其专用的本地状态存储。

卡夫卡流

Kafka溪流 - 本地商店

让咱们用它的Command来探索Apache Kafka Operations

d。容错

可是,它集成在Kafka中,它基于容错功能。虽然流数据持久保存到Kafka,但即便应用程序失败并须要从新处理它也可用。此外,为了处理故障,Kafka Streams中的任务利用了Kafka消费者客户端提供的容错功能。 

此外,这里的本地国营商店也很容易出现故障。所以,它维护一个复制的更改日志Kafka主题,在该主题中,它跟踪每一个状态存储的任何状态更新。若是任务在另外一台计算机上失败并从新启动的任务上运行,则Kafka Streams会保证在失败以前经过重播相应的更改日志主题来恢复其关联的状态存储到内容以前的内容。所以,故障处理对最终用户彻底透明。
咱们来讨论Apache Kafka Monitoring - Methods&Tools

6.实施Kafka Streams

基本上,使用Kafka Streams构建,流处理应用程序看起来像:

A提供流配置

Properties streamsConfiguration = new Properties(); streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG, “Streaming-QuickStart”); streamsConfiguration.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, “localhost:9092”); streamsConfiguration.put(StreamsConfig.KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName()); streamsConfiguration.put(StreamsConfig.VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());

 

获取主题和Serdes

String topic = configReader.getKStreamTopic(); String producerTopic = configReader.getKafkaTopic(); final Serde stringSerde = Serdes.String(); final Serde longSerde = Serdes.Long();

 

破解卡夫卡专访的秘诀

C。构建流和获取数据

KStreamBuilder builder = new KStreamBuilder(); 
KStream <String,String> inputStreamData = builder.stream(stringSerde,stringSerde,producerTopic);

d。卡夫卡流的处理

KStream <String,Long> processedStream = inputStreamData.mapValues(record - > record.length())
除了链接和聚合操做以外,还有为KStream提供的其余转换操做的列表。所以,这些操做中的每个能够生成一个或多个KStream对象。此外,能够将一个或多个链接的处理器转换为底层处理器拓扑。此外,为了组成复杂的处理器拓扑,全部这些转换方法均可以连接在一块儿。
在这些转换中,filter,map,mapValues等是无状态转换操做,用户可使用它们将自定义函数做为参数传递,例如过滤器的谓词,地图的KeyValueMapper等,根据它们在语言。
让咱们了解Kafka Tools

即 写溪流回到卡夫卡

processedStream.to(stringSerde,longSerde,topic); 
这里,即便在内部结构初始化以后,处理也不会开始。所以,经过调用start()方法,咱们必须显式启动Kafka Streams线程:
KafkaStreams streams = new KafkaStreams(builder,streamsConfiguration); 
streams.start(); 
所以,最后一步是关闭Stream。

7. Kafka Streams的特色

  1. 最佳功能是弹性,高可扩展性和容错性。
  2. 部署到容器,VM,裸机,云。
  3. 对于小型,中型和大型用例,它一样可行。
  4. 它彻底与Kafka安全集成
  5. 编写标准Java应用程序
  6. 彻底一次处理语义。
  7. 不须要单独的处理集群。
  8. 它是在Mac,Linux,Windows上开发的。

8. Kafka Streams用例

一个。纽约时报

为了将已发布的内容实时存储和分发到为读者提供的各类应用程序和系统,它使用Apache Kafka和Kafka Streams。

湾 Zalando

Zalando使用Kafka做为ESB(企业服务总线)做为欧洲领先的在线时尚零售商。这有助于他们从单一服务架构过渡到微服务架构。此外,使用Kafka处理事件流,他们的技术团队能够实现近乎实时的商业智能。

C。线

为了相互通讯,LINE使用Apache Kafka做为其服务的中央数据中心。与Line同样,天天产生数千亿条消息,用于执行各类业务逻辑,威胁检测,搜索索引和数据分析。此外,Kafka帮助LINE可靠地转换和过滤主题,使消费者能够有效消费的子主题同时保持易于维护。

d。Pinterest的

为了为其广告基础设施的实时预测预算系统提供动力,Pinterest大规模使用Apache Kafka和Kafka Streams。Kafka Streams的支出预测比以往任什么时候候都更准确。
让咱们来修改卡夫卡的特点

即 荷兰合做银行

Apache Kafka支持数字神经系统,Rabobank的商务活动巴士。它是荷兰三大银行之一。经过使用Kafka Streams,该服务能够实时向客户发出金融事件的警报。

9.结论

所以,咱们已经详细了解了Apache Kafka Streams的概念。咱们讨论了流处理和实时处理。此外,咱们看到了Stream Processing Topology及其特殊处理器。以后,咱们转向Kafka Stream架构并实施Kafka Streams。最后,咱们研究了Kafka Streams的功能和用例

相关文章
相关标签/搜索