Kafka Streams | 流,实时处理和功能
1.目标
在我们之前的Kafka教程中,我们讨论了Kafka中的ZooKeeper。今天,在这个Kafka Streams教程中,我们将学习Kafka中Streams的实际含义。此外,我们将看到Kafka Stream架构,用例和Kafka流功能。此外,我们将讨论Apache Kafka中的流处理拓扑。
Kafka Streams是一个用于构建应用程序和微服务的客户端库,尤其是输入和输出数据存储在Apache Kafka Clusters中。基本上,凭借Kafka服务器端集群技术的优势,Kafka Streams结合了编写的简单性以及在客户端部署标准Java和Scala应用程序。
那么,让我们从Apache Kafka Streams开始吧。
首先,我们来讨论一下Stream和Real-Time Kafka Processing
2.卡夫卡的流和实时处理
我们称之为Kafka Stream处理,可以连续,同时,逐条记录地实时处理数据。
Kafka中的实时处理是Kafka的应用之一。
基本上,Kafka实时处理包括连续的数据流。因此,在分析了这些数据之后,我们从中获得了一些有用的数据。现在,在谈到Kafka时,实时处理通常涉及从主题(源)读取数据,进行一些分析或转换工作,然后将结果写回另一个主题(接收器)。要做这种类型的工作,有几种选择。
我们可以使用Kafka Consumer编写自己的自定义代码来读取数据并通过Kafka Producer写入数据。
或者我们使用完整的流处理框架,如Spark Streaming,Flink,Storm等。
但是,有一个替代上述选项,即Kafka Streams。那么,让我们了解Kafka Streams。
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或写入外部系统。
5. Kafka Streams Architecture
基本上,通过构建Kafka生产者和消费者库并利用Kafka的本机功能来提供数据并行性,分布式协调,容错和操作简单性,Kafka Streams简化了应用程序开发。
让我们修改Kafka架构
下图描述了使用Kafka Streams库的应用程序的解剖结构。
一个。流分区和任务
但是,对于存储和传输,Kafka的消息传递层对数据进行分区。同样,对于处理数据,Kafka Streams对其进行分区。因此,我们可以说分区是实现数据局部性,弹性,可伸缩性,高性能和容错的原因。在并行化的背景下,Kafka Streams和Kafka之间有着密切的联系:
- 每个Kafka流分区按顺序是一系列数据记录,并映射到Kafka主题分区。
- 流中的数据记录映射到该主题的Kafka消息。
- 在Kafka和Kafka Streams中,数据记录的密钥决定了数据的分区,即数据记录的密钥决定了到主题内特定分区的路由。
看看Kafka的优点和缺点
此外,通过将应用程序的处理器拓扑分解为多个任务,它可以进行缩放。但是,在应用程序的输入流分区的基础上,Kafka Streams创建了固定数量的任务,每个任务都分配了Kafka输入流中的分区列表(即Kafka主题)。 此外,无需人工干预,Kafka流任务既可以独立处理,也可以并行处理。
下图描述了两个任务,每个任务分配了输入流的一个分区。
湾 线程模型
Kafka Streams允许用户配置库可用于在应用程序实例中并行化进程的线程数。但是,凭借其独立的处理器拓扑,每个线程可以执行一个或多个任务。例如,下面的图像描述了一个运行两个流任务的流线程。
C。当地的国家商店
Kafka Streams提供所谓的国营商店。基本上,我们使用它来通过流处理应用程序存储和查询数据,这是实现有状态操作时的一项重要功能。例如,当您调用有状态运算符(例如join()或aggregate())或者窗口化流时,Kafka Streams DSL会自动创建和管理此类状态存储。
在Kafka Streams应用程序中,每个流任务可以嵌入一个或多个本地状态存储,甚至API也可以访问存储并查询处理所需的数据。此外,Kafka Streams等本地国营商店提供容错和自动恢复功能。
想知道Apache 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());
B 获取主题和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的特点
- 最佳功能是弹性,高可扩展性和容错性。
- 部署到容器,VM,裸机,云。
- 对于小型,中型和大型用例,它同样可行。
- 它完全与Kafka安全集成。
- 编写标准Java应用程序。
- 完全一次处理语义。
- 不需要单独的处理集群。
- 它是在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的功能和用例