Kafka-初识

时间:2024-10-15 12:28:34

一、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的认知图