Kafka简介:
Apache Kafka 是一个分布式流处理平台,由 LinkedIn 开发并开源,后来成为 Apache 软件基金会的顶级项目。Kafka 主要用于构建实时数据管道和流式应用程序。它具有高吞吐量、可扩展性和容错性,能够处理数百万级别的读写请求。
Kafka 的核心特性包括:
-
发布-订阅消息队列:Kafka 允许生产者(发布者)发送消息到主题(Topic),消费者(订阅者)从主题读取消息。这使得 Kafka 可以作为消息队列、消息总线或数据集成层使用。
-
持久化存储:Kafka 将消息持久化到磁盘,并支持数据复制,确保消息不会丢失,并可以在系统故障后恢复。
-
分布式系统:Kafka 通过分区(Partition)和副本(Replication)机制实现分布式,提高了系统的可扩展性和容错性。
-
实时流处理:Kafka Streams 和 Kafka Connect 提供了实时数据流处理和集成解决方案,可以与现有的数据存储和分析工具集成。
-
可扩展性:Kafka 集群可以轻松地通过增加更多的服务器来扩展,以处理更多的数据流量。
-
容错性:Kafka 通过副本机制确保数据的持久性和可靠性。如果某个代理(Broker)失败,其他代理可以接管其任务。
-
生态系统:Kafka 拥有丰富的生态系统,包括 Kafka Connect、Kafka Streams、Confluent Schema Registry 等,这些工具和库扩展了 Kafka 的功能,使其更加强大和灵活。
-
社区支持:作为 Apache 基金会的一部分,Kafka 拥有一个活跃的社区,不断有新的特性和改进被贡献和发布。
Kafka 通常用于日志聚合、事件源、流处理、实时分析、数据管道和微服务架构中的消息传递。它的设计使其成为处理大规模数据流的理想选择,特别是在需要高吞吐量和低延迟的场景中。
安装步骤
Step 1: 获取 Kafka
首先,您需要从 Apache Kafka 的官方网站下载最新的 Kafka 发行版。下载完成后,您需要解压该文件。
$ tar -xzf kafka_2.13-3.8.0.tgz
$ cd kafka_2.13-3.8.0
Step 2: 启动 Kafka 环境
在开始之前,请确保您的本地环境已安装 Java 8 或更高版本。
Kafka 可以使用 KRaft 或 ZooKeeper 模式启动。您可以选择其中一种配置来启动 Kafka 服务器。
使用 KRaft 模式
-
生成集群 UUID:
$ KAFKA_CLUSTER_ID="$(bin/kafka-storage.sh random-uuid)"
-
格式化日志目录:
$ bin/kafka-storage.sh format -t $KAFKA_CLUSTER_ID -c config/kraft/server.properties
-
启动 Kafka 服务器:
$ bin/kafka-server-start.sh config/kraft/server.properties
使用 ZooKeeper 模式
-
启动 ZooKeeper 服务:
$ bin/zookeeper-server-start.sh config/zookeeper.properties
-
打开另一个终端会话,启动 Kafka 代理服务:
$ bin/kafka-server-start.sh config/server.properties
使用 Docker 镜像
-
获取 Kafka Docker 镜像:
$ docker pull apache/kafka:3.8.0
-
启动 Kafka Docker 容器:
$ docker run -p 9092:9092 apache/kafka:3.8.0
Step 3: 创建主题以存储事件
Kafka 是一个分布式事件流平台,允许您在多台机器上读取、写入、存储和处理事件(也称为记录或消息)。
在写入第一个事件之前,您需要创建一个主题。打开另一个终端会话并运行以下命令:
$ bin/kafka-topics.sh --create --topic quickstart-events --bootstrap-server localhost:9092
您可以使用以下命令查看主题的详细信息:
$ bin/kafka-topics.sh --describe --topic quickstart-events --bootstrap-server localhost:9092
Step 4: 将一些事件写入主题
Kafka 客户端通过网络与 Kafka 代理通信,以写入(或读取)事件。一旦接收到事件,代理将以持久和容错的方式存储这些事件。
运行控制台生产者客户端,将一些事件写入您的主题:
$ bin/kafka-console-producer.sh --topic quickstart-events --bootstrap-server localhost:9092
>This is my first event
>This is my second event
您可以通过按 Ctrl-C
随时停止生产者客户端。
Step 5: 读取事件
打开另一个终端会话,运行控制台消费者客户端来读取您刚刚创建的事件:
$ bin/kafka-console-consumer.sh --topic quickstart-events --from-beginning --bootstrap-server localhost:9092
This is my first event
This is my second event
您可以通过按 Ctrl-C
随时停止消费者客户端。
Step 6: 使用 Kafka Connect 导入/导出数据
Kafka Connect 允许您持续地将数据从外部系统导入到 Kafka,以及从 Kafka 导出到外部系统。它运行连接器,实现与外部系统的自定义逻辑。
首先,确保将 connect-file-3.8.0.jar
添加到 Connect 工作节点的配置中的 plugin.path
属性。
编辑 config/connect-standalone.properties
文件,添加或更改 plugin.path
配置属性,并保存文件:
$ echo "plugin.path=libs/connect-file-3.8.0.jar" >> config/connect-standalone.properties
然后,创建一些种子数据来测试:
$ echo -e "foo\nbar" > test.txt
或者,在 Windows 上:
$ echo foo > test.txt
$ echo bar >> test.txt
接下来,我们将启动两个连接器,以独立模式运行,这意味着它们将在单个、本地、专用的进程中运行。我们提供三个配置文件作为参数。第一个是 Kafka Connect 进程的配置,包含连接到 Kafka 代理和数据的序列化格式的常见配置。其余的配置文件每个都指定一个连接器来创建。这些文件包括一个唯一的连接器名称、要实例化的连接器类以及连接器所需的任何其他配置。
$ bin/connect-standalone.sh config/connect-standalone.properties config/connect-file-source.properties config/connect-file-sink.properties
这些示例配置文件,包含在 Kafka 中,使用您之前启动的本地集群配置,并创建两个连接器:第一个是源连接器,从输入文件读取行并将每个行生成到 Kafka 主题,第二个是汇连接器,从 Kafka 主题读取消息并将每个消息作为输出文件中的一行。
Step 7: 使用 Kafka Streams 处理事件
一旦您的数据作为事件存储在 Kafka 中,您可以使用 Kafka Streams 客户端库(Java/Scala)处理数据。它允许您实现关键任务实时应用程序和微服务,其中输入和/或输出数据存储在 Kafka 主题中。Kafka Streams 结合了在客户端编写和部署标准 Java 和 Scala 应用程序的简便性与 Kafka 的服务器端集群技术的优势,使这些应用程序具有高可扩展性、弹性、容错性和分布式特性。该库支持精确一次处理、有状态操作和聚合、窗口、连接、基于事件时间的处理等。
以下是如何实现流行的 WordCount
算法的示例:
KStream<String, String> textLines = builder.stream("quickstart-events");
KTable<String, Long> wordCounts = textLines
.flatMapValues(line -> Arrays.asList(line.toLowerCase().split(" ")))
.groupBy((keyIgnored, word) -> word)
.count();
wordCounts.toStream().to("output-topic", Produced.with(Serdes.String(), Serdes.Long()));
Step 8: 终止 Kafka 环境
现在您已经完成了 Kafka 的快速入门,可以随意拆除 Kafka 环境,或者继续探索。
-
如果您还没有这样做,请使用
Ctrl-C
停止生产者和消费者客户端。 -
使用
Ctrl-C
停止 Kafka 代理。 -
如果您遵循了使用 ZooKeeper 的部分,请使用
Ctrl-C
停止 ZooKeeper 服务器。
如果您还想删除本地 Kafka 环境的数据,包括您创建的事件,可以运行以下命令:
$ rm -rf /tmp/kafka-logs /tmp/zookeeper /tmp/kraft-combined-logs
Kafka数据发送流程示例图: