1.目标

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

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

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

Kafka Streams | 流和实时处理

首先,我们来讨论一下Stream和Real-Time Kafka Processing

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

我们称之为Kafka Stream处理,可以连续,同时,逐条记录地实时处理数据。

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

基本上,Kafka实时处理包括连续的数据流。因此,在分析了这些数据之后,我们从中获得了一些有用的数据。现在,在谈到Kafka时,实时处理通常涉及从主题(源)读取数据,进行一些分析或转换工作,然后将结果写回另一个主题(接收器)。要做这种类型的工作,有几种选择。

我们可以使用Kafka Consumer编写自己的自定义代码来读取数据并通过Kafka Producer写入数据

或者我们使用完整的流处理框架,如Spark StreamingFlink,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或写入外部系统。

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:”);
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的特点

  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的功能和用例

Kafka Streams | 流,实时处理和功能的更多相关文章

  1. Kafka Streams详细

    概述 1 Kafka Streams Kafka Streams.Apache Kafka开源项目的一个组成部分.是一个功能强大,易于使用的库.用于在Kafka上构建高可分布式.拓展性,容错的应用程序 ...

  2. 手把手教你写Kafka Streams程序

    本文从以下四个方面手把手教你写Kafka Streams程序: 一. 设置Maven项目 二. 编写第一个Streams应用程序:Pipe 三. 编写第二个Streams应用程序:Line Split ...

  3. [翻译]Kafka Streams简介: 让流处理变得更简单

    Introducing Kafka Streams: Stream Processing Made Simple 这是Jay Kreps在三月写的一篇文章,用来介绍Kafka Streams.当时Ka ...

  4. Kafka Streams简介: 让流处理变得更简单

    Introducing Kafka Streams: Stream Processing Made Simple 这是Jay Kreps在三月写的一篇文章,用来介绍Kafka Streams.当时Ka ...

  5. Spark Streaming,Flink,Storm,Kafka Streams,Samza:如何选择流处理框架

    根据最新的统计显示,仅在过去的两年中,当今世界上90%的数据都是在新产生的,每天创建2.5万亿字节的数据,并且随着新设备,传感器和技术的出现,数据增长速度可能会进一步加快. 从技术上讲,这意味着我们的 ...

  6. Confluent Platform 3.0支持使用Kafka Streams实现实时的数据处理(最新版已经是3.1了,支持kafka0.10了)

    来自 Confluent 的 Confluent Platform 3.0 消息系统支持使用 Kafka Streams 实现实时的数据处理,这家公司也是在背后支撑 Apache Kafka 消息框架 ...

  7. 浅谈kafka streams

    随着数据时代的到来,数据的实时计算也越来越被大家重视.实时计算的一个重要方向就是实时流计算,目前关于流计算的有很多成熟的技术实现方案,比如Storm.Spark Streaming.flink等.我今 ...

  8. Apache Kafka 0.11版本新功能简介

    Apache Kafka近日推出0.11版本.这是一个里程碑式的大版本,特别是Kafka从这个版本开始支持“exactly-once”语义(下称EOS, exactly-once semantics) ...

  9. 大全Kafka Streams

    本文将从以下三个方面全面介绍Kafka Streams 一. Kafka Streams 概念 二. Kafka Streams 使用 三. Kafka Streams WordCount   一. ...

随机推荐

  1. LeetCode 1011. Capacity To Ship Packages Within D Days

    原题链接在这里:https://leetcode.com/problems/capacity-to-ship-packages-within-d-days/ 题目: A conveyor belt h ...

  2. 动手动脑---找出指定文件夹下所有包容指定字符串的txt文件

    思路:先判断是否为文件,如果是文件,则需要判断改文件名是否包含字符串"txt",包含则输出.如果是文件夹的话,先需要判断文件名是否包含".txt"(因为文件名也 ...

  3. Oracle 查看index是否失效

    一.普通索引是否失效 select * from dba_indexes s where s.owner  in ('ISMP','BOSS','PAY','ACCOUNT','SETTLE','TE ...

  4. php web开发——文件夹的上传和下载

    核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...

  5. BZOJ 3689: 异或之 可持久化trie+堆

    和超级钢琴几乎是同一道题吧... code: #include <bits/stdc++.h> #define N 200006 #define ll long long #define ...

  6. C++对象内存布局,this指针,对象作为参数,作为返回值

    class TestClass { public: void setNum(int num) { m_num1 = num; } int getNum() { return m_num1; } pri ...

  7. rpm 简单 package 创建demo

    安装的工具 yum install -y rpmdevtools 准备环境 主要是初始化,会自动创建rpm 包构建需要的目录 rpmdev-setuptree 编写简单的spec cd ~/rpmbu ...

  8. CSS3 之loading动画实现思路

    效果大致如下: 主要实现方式: 该效果主要用到animation-timing-function中的steps()函数,该函数主要用于分步隐藏不同模块. 实现思路: 第一步动画: 第二步动画: 第三步 ...

  9. 使用JS计算前一天和后一天

    使用JS实现前一天和后一天 首先,我们先在html中写两个按钮来进行简单操作 <button onclick="Before()">前一天</button> ...

  10. 坑爹微信之读取PKCS12流时出现的java.io.IOException: DerInputStream.getLength

    背景 微信退款接口需要使用到证书,我参考微信的官方Demo进行,部分代码如下: char[] password = config.getMchID().toCharArray(); InputStre ...