Kafka-初识

news2024/10/12 1:38:21

一、Kafka是什么?

Kafka是一个高度可扩展、弹性、容错和安全的分布式流处理平台,由服务器和客户端组成,通过高性能TCP网络协议进行通信。它可以像消息队列一样生产和消费数据。可以部署在裸机硬件、虚拟机和容器上,也可以部署在本地和云中。

二、名词解析

1、事件(Event)

事件记录了世界上或企业中“发生了一些事情“的事实。它也被称为留档中的记录或消息。当向Kafka读取或写入数据时,以事件的形式执行此操作。从概念上讲,事件具有键、值、时间戳和可选的元数据头。下面是一个示例事件:

Event key :Alice

Event value: 向Bob支付了200美元

Event timestamp:2024年10月8日下午2:06

2、事件流(Event Streaming)

事件流是以事件流的形式从数据库、传感器、移动设备、云服务和软件应用程序等事件源实时捕获数据的做法;持久地存储这些事件流以供以后检索;实时和回顾性地操纵、处理和响应事件流;并根据需要将事件流路由到不同的目的地技术。因此,事件流确保了数据的连续流动和解释,以便在正确的时间将正确的信息放在正确的位置。

我们可以将事件流用于一系列实时场景,比如实时支付、实时跟踪和监控、实时反馈等

3、Kafka服务器

Kafka作为一个或多个服务器的集群运行,这些服务器可以跨越多个数据中心或云区域。其中一些服务器构成了存储层,称为代理。其他服务器运行Kafka Connect,以连续导入和导出数据作为事件流,将Kafka与现有系统(如关系数据库和其他Kafka集群)集成。为了让你实现关键任务用例,Kafka集群具有高度的可扩展性和容错性:如果它的任何服务器发生故障,其他服务器将接管它们的工作,以确保连续运行而不会丢失任何数据。

Kafka服务器也是一个主从架构,一个Kafka有一个或多个Broker,其中有一个Broker会依赖Zookeeper被选举为Controller。Controller负责管理集群中所有分区和副本状态。

4、Kafka客户端

它们允许我们编写分布式应用程序和微服务,即使在网络问题或机器故障的情况下,也能并行、大规模、容错地读取、写入和处理事件流。Kafka附带了一些这样的客户端,这些客户端由Kafka社区提供的数十个客户端增强:客户端可用于Java和Scala,包括更高级别的Kafka Streams库,用于Go、Python、C/C++和许多其他编程语言以及REST API。

4.1、生产者(Producer)

生产者是那些向Kafka发布(写入)事件的客户端应用程序

4.2、消费者(Consumer)

消费者是那些订阅(读取和处理)这些事件的应用程序

在Kafka中,生产者和消费者是完全解耦的,彼此不可知,这是实现Kafka众所周知的高可扩展性的关键设计元素。例如,生产者永远不需要等待消费者。Kafka提供了各种保证,例如能够只处理一次事件。

5、主题(topic)

事件被组织并持久地存储在主题中。非常简单,主题类似于文件系统中的文件夹,事件就是该文件夹中的文件。例如主题名称可以是“付款”。Kafka中的主题总是多生产者和多订阅者的:一个主题可以有零个、一个或多个生产者向其写入事件,也可以有零、一个、或多个消费者订阅这些事件。主题中的事件可以根据需要随时读取——与传统的消息传递系统不同,事件在使用后不会被删除。相反,您可以通过按主题配置设置来定义Kafka应该保留事件多长时间,之后旧事件将被丢弃。Kafka的性能在数据大小方面实际上是恒定的,因此长时间存储数据是完全可以的。

6、分组(group)

该分组是针对消费者来分组,每个consumer都属于一个特定的组,多个consumer可以共同消息一个Topic下的消息。每个consumer消费其中的部分分区数据。

7、分区 (partition)

主题(topic)是分区的,这意味着一个主题分布在位于不同Kafka代理上的多个“桶”上。这种数据的分布式放置对于可扩展性非常重要,因为它允许客户端应用程序同时从多个代理读取数据和向多个代理写入数据。当一个新事件发布到一个主题时,它实际上会附加到该主题的一个分区上。具有相同事件密钥(例如,客户或车辆ID)的事件被写入同一分区,Kafka保证给定主题分区的任何消费者将始终以与写入顺序完全相同的顺序读取该分区的事件。

下面的官网上的解释图:

从图中可以看出:该主题有四个分区P1-P4。两个不同的生产者客户端通过网络将事件写入主题的分区,彼此独立地向主题发布新事件。具有相同键的事件(在图中用它们的颜色表示)被写入同一个分区。请注意,如果合适,两个生产者都可以写入同一个分区。

8、副本(replicated)

为了使数据具有容错性和高可用性,每个主题都可以复制,甚至可以跨地理区域或数据中心复制,这样总有多个代理拥有数据副本,以防出现问题、您想对代理进行维护等等。常见的生产设置是复制系数为3,即您的数据总是有三个副本。此复制在主题分区级别执行。

请注意:这里的副本是用来提高容错和高可用的,并不是用来提升读写性能的,因此读写只发生在主的那份数据上。

9、偏移量(Offset 

偏移量是针对分区的,是consumer在对应分区消费的水位线

三、API

1、 Admin API:用于管理和检查主题、代理和其他Kafka对象

2、Producer API:将事件流发布(写入)到一个或多个Kafka主题

3、Consumer API:用于订阅(读取)一个或多个主题并处理产生给它们的事件流

4、Kafka Streams API:用于实现流处理应用程序和微服务。它提供了更高级的函数来处理事件流,包括转换、聚合和连接等有状态操作、窗口、基于事件时间的处理等。从一个或多个主题读取输入,以生成对一个或更多主题的输出,从而有效地将输入流转换为输出流。

5、Kafka Connect API:用于构建和运行可重复使用的数据导入/导出连接器,这些连接器消耗(读取)或生成(写入)来自外部系统和应用程序的事件流,以便与Kafka集成。例如,像PostgreSQL这样的关系数据库的连接器可能会捕获一组表的每一个更改。然而,在实践中,通常不需要实现自己的连接器,因为Kafka社区已经提供了数百个即用型连接器。

四:入门小例子

下面我们用官网给的快速入门小例子来实践下,为了方便我使用cdh安装了Kafka

1、创建一个主题(topic)来存储事件

Kafka是一个分布式事件流平台,可让您读取、写入、存储和处理 事件(也称为记录或 留言在留档) 跨许多机器。

事件是支付交易、来自手机的地理位置更新、运输订单、传感器测量 来自物联网设备或医疗设备等等。这些事件被组织和存储在 主题。 非常简化,主题类似于文件系统中的文件夹,事件是该文件夹中的文件。

因此,在编写第一个事件之前,我们必须创建一个主题。打开一个终端窗口并运行:

kafka-topics --create --topic quickstart-events --bootstrap-server cdh1:9092 --partitions 2 --replication-factor 2

结果:

 查看topic列表

kafka-topics -list --zookeeper cdh1:2181

结果:

 查看topic详情

kafka-topics --describe --zookeeper cdh1:2181 --topic quickstart-events

结果:

调整topic分区数

kafka-topics --zookeeper cdh1:2181 --alter --topic quickstart-events --partitions 3

 结果:

查看 topic 指定分区 offset

kafka-run-class kafka.tools.GetOffsetShell --topic quickstart-events  --time -1 --broker-list cdh1:9092 --partitions 0 

 结果:

 删除topic

kafka-topics --create --topic quickstart-temp --bootstrap-server cdh1:9092 --partitions 2 --replication-factor 2
kafka-topics --delete --zookeeper cdh1:2181 --topic quickstart-temp

结果:

2、向主题(topic)写入事件

Kafka客户端通过网络与Kafka代理通信以写入(或读取)事件。一旦收到,代理将以持久和容错的方式存储事件,只要您需要-甚至可以永远存储。

运行控制台生产者客户端以将一些事件写入刚刚新建的主题。默认情况下,输入的每一行都将导致一个单独的事件写入主题。

kafka-console-producer --topic quickstart-events --broker-list cdh1:9092,cdh2:9092,cdh3:9092

结果:

 可以随时使用Ctrl-C停止生产者客户端。

3、从主题(topic)读取事件

打开另一个终端会话并运行控制台消费者客户端以读取刚刚创建的事件:

kafka-console-consumer --topic quickstart-events --from-beginning --bootstrap-server cdh1:9092,cdh2:9092,cdh3:9092

结果:

同样可以通过Ctrl-C停止消费者客户端

如果我们用kafka-console-producer命令再随意写一些事件,消费者客户端会实时出现打印

如果我们再新的会话窗口再启一个消费者客户端呢,会出现如下结果:

为什么新的消费者客户端的打印顺序出现了不同?因为我们有三个分区,如果我们指定分区去消费就会得到顺序的数据

kafka-console-consumer --topic quickstart-events --from-beginning --bootstrap-server cdh1:9092,cdh2:9092,cdh3:9092 --partition 2

结果:

分区0的数据为:This is my first event

分区1的数据为:222

此时我们查看下group的数量,发现是两个,也就是如果我们不指定group,就默认给我们创建一个新的group

kafka-consumer-groups --bootstrap-server cdh1:9092,cdh2:9092,cdh3:9092 --list

结果:

 

4、使用Kafka Connect将数据作为事件流导入/导出

我们可能在关系数据库或传统消息传递系统等现有系统中拥有大量数据,以及已经使用这些系统的许多应用程序。Kafka Connect允许我们不断地将数据从外部系统摄取到Kafka中,反之亦然。它是一个可扩展的工具,运行连接器,实现与外部系统交互的自定义逻辑。因此,将现有系统与Kafka集成非常容易。为了使这一过程更容易,有数百个这样的连接器可供选择。

我们现在使用一个简单的连接器运行Kafka Connect,这些连接器将数据从文件导入Kafka主题并将数据从Kafka主题导出到文件。 

5、使用Kafka Streams 处理事件

一旦你的数据作为事件存储在Kafka中,你就可以使用Java/Scala的Kafka Streams客户端库来处理数据。它允许您实现关键任务实时应用程序和微服务,其中输入和/或输出数据存储在Kafka主题中。Kafka Streams将在客户端编写和部署标准Java和Scala应用程序的简单性与Kafka服务器端集群技术的优势相结合,使这些应用程序具有高度可扩展性、弹性、容错性和分布式。该库支持一次处理、有状态操作和聚合、窗口、连接、基于事件时间的处理等等。

五、总结图

从以上的知识中我们可以总结性的来画下Kafka的认知图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2206515.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用3080ti运行blip2的

使用3080ti运行blip2的案例 注意!blip2很吃显存,需要大于80GB显存的卡。我最后安装的所有包的版本信息(python 3.9 )以供参考: 首先,我在运行blip2的demo的时候显存用了80G以上,所以大家卡的显存…

VS Code最新版本Retome远程ssh不兼容旧服务器问题

✨✨欢迎来到T_X_Parallel的博客!!       🛰️博客主页:T_X_Parallel       🛰️欢迎关注:👍点赞🙌收藏✍️留言 目录 问题:无法正常使用vscode-remote插件远…

深度优先搜索 - 岛屿最大面积

题目描述 给定一个由 0 和 1 组成的非空二维数组 grid ,用来表示海洋岛屿地图。 一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水&…

从零开始搭建UVM平台(十二)-加入sequence机制

书接上回: 从零开始搭建UVM平台(一)-只有uvm_driver的验证平台 从零开始搭建UVM平台(二)-加入factory机制 从零开始搭建UVM平台(三)-加入objection机制 从零开始搭建UVM平台(四&…

邮件系统国产化改造: 保障信息安全、提升效率的最佳选择

在当前数字化转型的大背景下,我国政府提出了构建网络强国和数字强国的宏伟蓝图。这一战略的实施,不仅为数字政府的建设提供了坚实的基础,也为政府和企业的数字化升级指明了方向。在这一进程中,邮件系统的国产化改造就显得尤为重要…

功能安全测试安全渗透测试,一文讲清楚

本文我们将以围绕系统安全质量提升为目标,讲述在功能安全测试&安全渗透测试上实践过程。 希望通过此篇文章,帮助大家更深入、透彻地了解安全测试。 安全渗透测试实践 安全前置扫描主要是识别白盒漏洞、黑盒漏洞问题,针对JSRC类问题&am…

pycharm里debug时如何看到数据的维度

使用表达式计算(Evaluate Expression) 调试时,使用 PyCharm 的 “Evaluate Expression” 功能可以动态查看或修改数据。具体步骤如下: 在调试模式中按 Alt F8(Windows)或 Option F8(Mac&…

ARC学习(4)基本编程模型认识(四)----寄存器以及异常数据读取

笔者来聊一下ARC寄存器的获取 在介绍了ARC编程模型的知识点之后,来看一些具体的编程操作,比如如何获取寄存器,如何编写汇编语言实现特定功能? 1、获取寄存器 可以使用内联汇编来实现寄存器的获取,具体格式如下: _Asm:汇编宏标识符,指示内联汇编代码_Save_all_regs:…

第十二章 RabbitMQ之失败消息处理策略

目录 一、引言 二、RepublishMessageRecoverer 实现 2.1. 实现步骤 2.2. 实现代码 2.2.1. 异常交换机队列回收期配置类 2.2.2. 常规交换机队列配置类 2.2.3. 消费者代码 2.2.4. 消费者yml配置 2.2.5. 生产者代码 2.2.6. 生产者yml配置 2.2.7. 运行效果 一、引言 …

【瑞萨RA8D1 CPK开发板】串口的使用和STDOUT输出重定向

串口 本次串口的使用关于时钟导致串口的波特率不对,坑了我很久的时间 使能时钟 串口发现一个问题就是,只能使用下边的时钟配置,修改时钟源和分频系数都会导致串口波特率不正常,这种问题出现在mdkrasc的使用场景之下&#xff1b…

bclinux安装minio和mc及从服务器上下载文件

下载MinIO服务器二进制文件 访问MinIO的官方网站或使用wget、curl等工具直接从MinIO的官方GitHub存储库下载最新版本的MinIO服务器二进制文件。例如,使用以下命令: 下载命令:wget https://dl.min.io/server/minio/release/linux-amd64/ 授…

Hadoop三大组件的工作原理

Hadoop三大组件的工作原理 一、引言 Hadoop是一个开源的分布式计算框架,在大数据处理领域具有举足轻重的地位。其核心组件包括HDFS(分布式文件系统)、MapReduce(分布式计算框架)和YARN(资源管理系统&…

Vue3 ECharts看板

获取 ECharts - 入门篇 - 使用手册 - Apache ECharts npm install echarts <template><div id"main" style"height:400px;"></div> </template><script lang"ts" setup> import { ref, onMounted } from "…

AcWing 905:区间选点 ← 贪心算法

【题目来源】https://www.acwing.com/problem/content/907/【题目描述】 给定 N 个闭区间 [ai,bi]&#xff0c;请你在数轴上选择尽量少的点&#xff0c;使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量。 位于区间端点上的点也算作区间内。【输入格式】 第一行包…

【论文阅读笔记】End-to-End Object Detection with Transformers

代码地址&#xff1a;https://github.com/facebookresearch/detr 论文小结 本文是Transformer结构应用于目标检测&#xff08;OD&#xff09;任务的开山之作。方法名DETE&#xff0c;取自Detection Transformer。   作为2020年的论文&#xff0c;其表现精度在当时也不算高的…

Linux:信号保存与处理

使用kill -l命令查看信号&#xff1a; 信号量和信号确实一点关系没有 信号是操作系统发出的进程与进程之间的通知于中断&#xff0c;是进程之间时间异步通知的一种方式 先了解同步通信&#xff1a;同步通信是一种比特同步通信技术&#xff0c;要求发收双方具有同频同相的同步…

学以致用 SAP HCM 顾问excel函数实战系列

EXCEL函数&#xff1a;在上学的时候&#xff0c;对word、excel、PPT感觉都很简单&#xff0c;稀里糊涂的学&#xff0c;稀里糊涂的忘&#xff0c;然后走向工作岗位的时候&#xff0c;突然发现这三大宝剑无比锋利&#xff0c;可惜自己太菜&#xff0c;曾经努力学习&#xff0c;但…

前端 | Uncaught (in promise) undefined

前端 | Uncaught (in promise) undefined 最近开发运行前端项目时&#xff0c;经常预计控制台报错 &#xff0c;如下图&#xff1a; 这里我总结下&#xff0c;这种报错的场景和原因&#xff0c;并通过实际代码案例帮助小伙伴更好理解下 。 文章目录 前端 | Uncaught (in promi…

数据丢失的终极克星来了!EasyRecovery17数据恢复软件

数据丢失的终极克星来了&#xff01; 各位亲爱的朋友们&#xff0c;你们有没有经历过那种“哎呀妈呀&#xff0c;重要文件找不到了&#xff01;”的绝望时刻&#xff1f;别急&#xff0c;今天我要向你们安利一款神器——EasyRecovery17数据恢复软件&#xff0c;简直是我们这些“…

Javascript笔试题目(二)

1.如何使用ES6语法对函数所有参数进行求和?请写出具体代码 function sumAll(...args) { // args 是一个数组&#xff0c;包含了函数接收到的所有参数 return args.reduce((accumulator, currentValue) > accumulator currentValue, 0); } // 测试函数 console.log…